diff --git a/lib/WWW/StrawViewer.pm b/lib/WWW/StrawViewer.pm index 000d307..213b801 100644 --- a/lib/WWW/StrawViewer.pm +++ b/lib/WWW/StrawViewer.pm @@ -556,6 +556,7 @@ sub select_good_invidious_instances { my %ignored = ( 'yewtu.be' => 1, + 'invidious.tube' => 1, 'invidiou.site' => 1, 'invidious.xyz' => 1, 'vid.mint.lgbt' => 1, @@ -567,7 +568,15 @@ sub select_good_invidious_instances { my @candidates = grep { not $ignored{$_->[0]} } - grep { ref($_->[1]{monitor}) eq 'HASH' ? ($_->[1]{monitor}{statusClass} eq 'success') : $args{lax} } + grep { + $args{lax} ? 1 : eval { $_->[1]{monitor}{dailyRatios}[0]{label} eq 'success' } + } + grep { + $args{lax} ? 1 : eval { $_->[1]{monitor}{weeklyRatio}{label} eq 'success' } + } + grep { + $args{lax} ? 1 : eval { $_->[1]{monitor}{statusClass} eq 'success' } + } grep { lc($_->[1]{type} // '') eq 'https' } @$instances; if ($self->get_debug) { @@ -581,7 +590,7 @@ sub select_good_invidious_instances { return @candidates; } -sub pick_random_instance { +sub pick_good_random_instance { my ($self) = @_; my @candidates = $self->select_good_invidious_instances(); @@ -589,13 +598,33 @@ sub pick_random_instance { @candidates = $self->select_good_invidious_instances(lax => 1); } + require List::Util; + require WWW::StrawViewer::Utils; + + state $yv_utils = WWW::StrawViewer::Utils->new(); + + foreach my $instance (List::Util::shuffle(@candidates)) { + + ref($instance) eq 'ARRAY' or next; + + my $uri = $instance->[1]{uri} // next; + $uri =~ s{/+\z}{}; # remove trailing '/' + + local $self->{api_host} = $uri; + my $results = $self->search_videos('test'); + + if ($yv_utils->has_entries($results)) { + return $instance; + } + } + $candidates[rand @candidates]; } sub pick_and_set_random_instance { my ($self) = @_; - my $instance = $self->pick_random_instance() // return; + my $instance = $self->pick_good_random_instance() // return; ref($instance) eq 'ARRAY' or return; diff --git a/lib/WWW/StrawViewer/Utils.pm b/lib/WWW/StrawViewer/Utils.pm index ace95a1..3a02351 100644 --- a/lib/WWW/StrawViewer/Utils.pm +++ b/lib/WWW/StrawViewer/Utils.pm @@ -223,6 +223,8 @@ Returns true if a given result has entries. sub has_entries { my ($self, $result) = @_; + $result // return 0; + if (ref($result->{results}) eq 'HASH') { foreach my $type (qw(comments videos playlists)) { @@ -247,7 +249,6 @@ sub has_entries { } return 1; # maybe? - #ref($result) eq 'HASH' and ($result->{results}{pageInfo}{totalResults} > 0); } =head2 normalize_video_title($title, $fat32safe)