diff options
author | trizen <trizen@protonmail.com> | 2020-09-08 13:34:00 +0300 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2020-09-14 11:00:19 -0500 |
commit | 84b0a86c4575c8dd6144a6e61dd49901eaad62ff (patch) | |
tree | cb240687a3cfe8b8c5d8b33d9034e1d5a541aba9 | |
parent | f31cbc76729af327b47b36b64a913381aa21d793 (diff) | |
download | fair-viewer-84b0a86c4575c8dd6144a6e61dd49901eaad62ff.tar.lz fair-viewer-84b0a86c4575c8dd6144a6e61dd49901eaad62ff.tar.xz fair-viewer-84b0a86c4575c8dd6144a6e61dd49901eaad62ff.zip |
- Use random instances in `_extract_from_invidious()`.
Signed-off-by: Jesús <heckyel@hyperbola.info>
-rw-r--r-- | lib/WWW/FairViewer.pm | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/lib/WWW/FairViewer.pm b/lib/WWW/FairViewer.pm index 408737d..448206a 100644 --- a/lib/WWW/FairViewer.pm +++ b/lib/WWW/FairViewer.pm @@ -527,14 +527,13 @@ sub get_invidious_instances { $self->parse_json_string($json_string); } -sub pick_random_instance { +sub select_good_invidious_instances { my ($self) = @_; state $instances = $self->get_invidious_instances; ref($instances) eq 'ARRAY' or return; - # These appear to not work properly with fair-viewer my %ignored = ( 'yewtu.be' => 1, 'invidiou.site' => 1, @@ -542,7 +541,7 @@ sub pick_random_instance { 'vid.mint.lgbt' => 1, 'invidious.ggc-project.de' => 1, 'invidious.toot.koeln' => 1, - 'invidious.snopyta.org' => 1, # too popular == too slow + 'invidious.snopyta.org' => 1, # too popular == too slow ); my @candidates = @@ -554,7 +553,13 @@ sub pick_random_instance { print STDERR ":: Found ", scalar(@candidates), " invidious instances.\n"; } - return $candidates[rand @candidates]; + return @candidates; +} + +sub pick_random_instance { + my ($self) = @_; + my @candidates = $self->select_good_invidious_instances(); + $candidates[rand @candidates]; } sub pick_and_set_random_instance { @@ -644,12 +649,36 @@ sub _make_feed_url { sub _extract_from_invidious { my ($self, $videoID) = @_; - my $url = sprintf($self->get_api_url . "videos/%s?fields=formatStreams,adaptiveFormats", $videoID); + my @instances = $self->select_good_invidious_instances(); + + if (@instances) { + require List::Util; + @instances = List::Util::shuffle(map { $_->[0] } @instances); + push @instances, 'invidious.13ad.de'; + } + else { + @instances = qw( + invidious.13ad.de + invidious.fdn.fr + invidious.site + invidious.tube + invidious.snopyta.org + ); + } + + if ($self->get_debug) { + print STDERR ":: Invidious instances: @instances\n"; + } + + my $tries = 2 * scalar(@instances); + my $instance = shift(@instances); + my $url_format = "https://%s/api/v1/videos/%s?fields=formatStreams,adaptiveFormats"; + my $url = sprintf($url_format, $instance, $videoID); - my $tries = 3; - my $resp = $self->{lwp}->get($url); + my $resp = $self->{lwp}->get($url); - while (not $resp->is_success() and $resp->status_line() =~ /read timeout/i and --$tries >= 0) { + while (not $resp->is_success() and --$tries >= 0) { + $url = sprintf($url_format, shift(@instances), $videoID) if (@instances and ($tries % 2 == 0)); $resp = $self->{lwp}->get($url); } |