From f141f51a9613c9d74680b1c9eb923ca7f20f901b Mon Sep 17 00:00:00 2001 From: trizen Date: Wed, 4 Nov 2020 14:25:02 +0200 Subject: - Stricter selection of a random invidious instance (with api_host => "auto"). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure that a randomly selected invidious actually works, by making a search request with keyword "test". Additionally, in the selection of instances, only include instances with "weeklyRatio = success" and "dailyRatios[0] = "success" (in addition to "statusClass = sucess"). Signed-off-by: Jesús --- lib/WWW/FairViewer.pm | 35 ++++++++++++++++++++++++++++++++--- lib/WWW/FairViewer/Utils.pm | 3 ++- 2 files changed, 34 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/WWW/FairViewer.pm b/lib/WWW/FairViewer.pm index 75f8fb0..bc01669 100644 --- a/lib/WWW/FairViewer.pm +++ b/lib/WWW/FairViewer.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::FairViewer::Utils; + + state $yv_utils = WWW::FairViewer::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/FairViewer/Utils.pm b/lib/WWW/FairViewer/Utils.pm index ccb5800..0144aec 100644 --- a/lib/WWW/FairViewer/Utils.pm +++ b/lib/WWW/FairViewer/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) -- cgit v1.2.3