aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortrizen <trizen@protonmail.com>2020-09-08 13:34:00 +0300
committerJesús <heckyel@hyperbola.info>2020-09-14 11:00:19 -0500
commit84b0a86c4575c8dd6144a6e61dd49901eaad62ff (patch)
treecb240687a3cfe8b8c5d8b33d9034e1d5a541aba9
parentf31cbc76729af327b47b36b64a913381aa21d793 (diff)
downloadfair-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.pm45
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);
}