diff options
-rwxr-xr-x | bin/fair-viewer | 32 | ||||
-rwxr-xr-x | bin/gtk-fair-viewer | 28 | ||||
-rw-r--r-- | lib/WWW/FairViewer.pm | 1 | ||||
-rw-r--r-- | lib/WWW/FairViewer/Itags.pm | 138 |
4 files changed, 96 insertions, 103 deletions
diff --git a/bin/fair-viewer b/bin/fair-viewer index d0fcf8f..c72db85 100755 --- a/bin/fair-viewer +++ b/bin/fair-viewer @@ -227,6 +227,7 @@ my %CONFIG = ( skip_if_exists => 1, prefer_mp4 => 0, prefer_av1 => 0, + ignore_av1 => 0, fat32safe => $constant{win32}, fullscreen => 0, results_with_details => 0, @@ -788,6 +789,7 @@ usage: $execname [options] ([url] | [keywords]) --confirm! : show a confirmation message after each play --prefer-mp4! : prefer videos in MP4 format, instead of WEBM --prefer-av1! : prefer videos in AV1 format, instead of WEBM + --ignore-av1! : ignore videos in AV1 format * Closed-captions --get-captions! : download closed-captions for videos @@ -1112,6 +1114,7 @@ sub apply_configuration { http_proxy page comments_order subscriptions_order user_agent cookie_file timeout ytdl ytdl_cmd + prefer_mp4 prefer_av1 ) ) { @@ -1140,14 +1143,6 @@ sub apply_configuration { } } - if (defined $opt->{prefer_mp4}) { - $yv_obj->set_prefer_mp4(delete($opt->{prefer_mp4}) ? 1 : 0); - } - - if (defined $opt->{prefer_av1}) { - $yv_obj->set_prefer_av1(delete($opt->{prefer_av1}) ? 1 : 0); - } - if (defined $opt->{hd}) { $yv_obj->set_videoDefinition(delete($opt->{hd}) ? 'high' : 'any'); } @@ -1592,6 +1587,7 @@ sub parse_arguments { 'prefer-mp4!' => \$opt{prefer_mp4}, 'prefer-av1!' => \$opt{prefer_av1}, + 'ignore-av1!' => \$opt{ignore_av1}, 'custom-layout!' => \$opt{custom_layout}, 'custom-layout-format=s' => \$opt{custom_layout_format}, @@ -3074,15 +3070,17 @@ sub get_streaming_url { $dash = $opt{merge_into_mkv} ? 1 : 0; } - my ($streaming, $resolution) = - $yv_itags->find_streaming_url( - urls => $urls, - resolution => ($opt{novideo} ? 'audio' : $opt{resolution}), - hfr => $opt{hfr}, - dash => $dash, - dash_mp4_audio => ($opt{novideo} ? 1 : $opt{dash_mp4_audio}), - dash_segmented => ($opt{download_video} ? 0 : $opt{dash_segmented}), - ); + my ($streaming, $resolution) = $yv_itags->find_streaming_url( + urls => $urls, + resolution => ($opt{novideo} ? 'audio' : $opt{resolution}), + + hfr => $opt{hfr}, + ignore_av1 => $opt{ignore_av1}, + + dash => $dash, + dash_mp4_audio => ($opt{novideo} ? 1 : $opt{dash_mp4_audio}), + dash_segmented => ($opt{download_video} ? 0 : $opt{dash_segmented}), + ); return { streaming => $streaming, diff --git a/bin/gtk-fair-viewer b/bin/gtk-fair-viewer index 18c52db..3274ce2 100755 --- a/bin/gtk-fair-viewer +++ b/bin/gtk-fair-viewer @@ -189,6 +189,7 @@ my %CONFIG = ( dash_segmented => 1, # may load slow prefer_mp4 => 0, prefer_av1 => 0, + ignore_av1 => 0, maxResults => 10, hfr => 1, # true to prefer high frame rate (HFR) videos resolution => 'best', @@ -881,6 +882,7 @@ sub apply_configuration { region videoCategoryId debug http_proxy user_agent timeout cookie_file ytdl ytdl_cmd + prefer_mp4 prefer_av1 ) ) { @@ -901,12 +903,6 @@ sub apply_configuration { # Enable/disable thumbnails $thumbs_checkbutton->set_active($CONFIG{show_thumbs}); - # Prefer MP4 over WEBM - $yv_obj->set_prefer_mp4($CONFIG{prefer_mp4} ? 1 : 0); - - # Prefer AV1 over WEBM - $yv_obj->set_prefer_av1($CONFIG{prefer_av1} ? 1 : 0); - # Set the "More options" expander $more_options_expander->set_expanded($CONFIG{active_more_options_expander}); @@ -3022,15 +3018,17 @@ sub get_streaming_url { require WWW::FairViewer::Itags; state $yv_itags = WWW::FairViewer::Itags->new(); - my ($streaming, $resolution) = - $yv_itags->find_streaming_url( - urls => $urls, - resolution => $CONFIG{resolution}, - hfr => $CONFIG{hfr}, - dash => $CONFIG{dash_support}, - dash_mp4_audio => $CONFIG{dash_mp4_audio}, - dash_segmented => $CONFIG{dash_segmented}, - ); + my ($streaming, $resolution) = $yv_itags->find_streaming_url( + urls => $urls, + resolution => $CONFIG{resolution}, + + hfr => $CONFIG{hfr}, + ignore_av1 => $CONFIG{ignore_av1}, + + dash => $CONFIG{dash_support}, + dash_mp4_audio => $CONFIG{dash_mp4_audio}, + dash_segmented => $CONFIG{dash_segmented}, + ); return { streaming => $streaming, diff --git a/lib/WWW/FairViewer.pm b/lib/WWW/FairViewer.pm index abe25cd..85c5e18 100644 --- a/lib/WWW/FairViewer.pm +++ b/lib/WWW/FairViewer.pm @@ -7,6 +7,7 @@ use warnings; use Memoize; memoize('_get_video_info'); +memoize('_ytdl_is_available'); memoize('_extract_from_ytdl'); memoize('_extract_from_invidious'); diff --git a/lib/WWW/FairViewer/Itags.pm b/lib/WWW/FairViewer/Itags.pm index 52ad82b..9ed04a8 100644 --- a/lib/WWW/FairViewer/Itags.pm +++ b/lib/WWW/FairViewer/Itags.pm @@ -46,93 +46,85 @@ sub get_itags { {value => 266, format => 'mp4', dash => 1}, # mp4 (2160p-2304p) (v) ], - '2160' => [ - {value => 315, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) - {value => 272, format => 'webm', dash => 1}, # webm (v) - {value => 313, format => 'webm', dash => 1}, # webm (v) - {value => 401, format => 'av1', dash => 1}, # av1 (v) + '2160' => [{value => 315, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) + {value => 272, format => 'webm', dash => 1}, # webm (v) + {value => 313, format => 'webm', dash => 1}, # webm (v) + {value => 401, format => 'av1', dash => 1}, # av1 (v) ], - '1440' => [ - {value => 308, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) - {value => 271, format => 'webm', dash => 1}, # webm (v) - {value => 264, format => 'mp4', dash => 1}, # mp4 (v) - {value => 400, format => 'av1', dash => 1}, # av1 (v) + '1440' => [{value => 308, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) + {value => 271, format => 'webm', dash => 1}, # webm (v) + {value => 264, format => 'mp4', dash => 1}, # mp4 (v) + {value => 400, format => 'av1', dash => 1}, # av1 (v) ], - '1080' => [ - {value => 303, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) - {value => 299, format => 'mp4', dash => 1, hfr => 1}, # mp4 HFR (v) - {value => 248, format => 'webm', dash => 1}, # webm (v) - {value => 137, format => 'mp4', dash => 1}, # mp4 (v) - {value => 399, format => 'av1', dash => 1}, # av1 (v) - {value => 46, format => 'webm'}, # webm (v-a) - {value => 37, format => 'mp4'}, # mp4 (v-a) - {value => 301, format => 'mp4', live => 1}, # mp4 (live) (v-a) - {value => 96, format => 'ts', live => 1}, # ts (live) (v-a) + '1080' => [{value => 303, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) + {value => 299, format => 'mp4', dash => 1, hfr => 1}, # mp4 HFR (v) + {value => 248, format => 'webm', dash => 1}, # webm (v) + {value => 137, format => 'mp4', dash => 1}, # mp4 (v) + {value => 399, format => 'av1', dash => 1}, # av1 (v) + {value => 46, format => 'webm'}, # webm (v-a) + {value => 37, format => 'mp4'}, # mp4 (v-a) + {value => 301, format => 'mp4', live => 1}, # mp4 (live) (v-a) + {value => 96, format => 'ts', live => 1}, # ts (live) (v-a) ], - '720' => [ - {value => 302, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) - {value => 298, format => 'mp4', dash => 1, hfr => 1}, # mp4 HFR (v) - {value => 247, format => 'webm', dash => 1}, # webm (v) - {value => 136, format => 'mp4', dash => 1}, # mp4 (v) - {value => 398, format => 'av1', dash => 1}, # av1 (v) - {value => 45, format => 'webm'}, # webm (v-a) - {value => 22, format => 'mp4'}, # mp4 (v-a) - {value => 300, format => 'mp4', live => 1}, # mp4 (live) (v-a) - {value => 120, format => 'flv', live => 1}, # flv (live) (v-a) - {value => 95, format => 'ts', live => 1}, # ts (live) (v-a) + '720' => [{value => 302, format => 'webm', dash => 1, hfr => 1}, # webm HFR (v) + {value => 298, format => 'mp4', dash => 1, hfr => 1}, # mp4 HFR (v) + {value => 247, format => 'webm', dash => 1}, # webm (v) + {value => 136, format => 'mp4', dash => 1}, # mp4 (v) + {value => 398, format => 'av1', dash => 1}, # av1 (v) + {value => 45, format => 'webm'}, # webm (v-a) + {value => 22, format => 'mp4'}, # mp4 (v-a) + {value => 300, format => 'mp4', live => 1}, # mp4 (live) (v-a) + {value => 120, format => 'flv', live => 1}, # flv (live) (v-a) + {value => 95, format => 'ts', live => 1}, # ts (live) (v-a) ], - '480' => [ - {value => 244, format => 'webm', dash => 1}, # webm (v) - {value => 135, format => 'mp4', dash => 1}, # mp4 (v) - {value => 397, format => 'av1', dash => 1}, # av1 (v) - {value => 44, format => 'webm'}, # webm (v-a) - {value => 35, format => 'flv'}, # flv (v-a) - {value => 94, format => 'mp4', live => 1}, # mp4 (live) (v-a) + '480' => [{value => 244, format => 'webm', dash => 1}, # webm (v) + {value => 135, format => 'mp4', dash => 1}, # mp4 (v) + {value => 397, format => 'av1', dash => 1}, # av1 (v) + {value => 44, format => 'webm'}, # webm (v-a) + {value => 35, format => 'flv'}, # flv (v-a) + {value => 94, format => 'mp4', live => 1}, # mp4 (live) (v-a) ], - '360' => [ - {value => 243, format => 'webm', dash => 1}, # webm (v) - {value => 134, format => 'mp4', dash => 1}, # mp4 (v) - {value => 396, format => 'av1', dash => 1}, # av1 (v) - {value => 43, format => 'webm'}, # webm (v-a) - {value => 34, format => 'flv'}, # flv (v-a) - {value => 93, format => 'mp4', live => 1}, # mp4 (live) (v-a) - {value => 18, format => 'mp4'}, # mp4 (v-a) + '360' => [{value => 243, format => 'webm', dash => 1}, # webm (v) + {value => 134, format => 'mp4', dash => 1}, # mp4 (v) + {value => 396, format => 'av1', dash => 1}, # av1 (v) + {value => 43, format => 'webm'}, # webm (v-a) + {value => 34, format => 'flv'}, # flv (v-a) + {value => 93, format => 'mp4', live => 1}, # mp4 (live) (v-a) + {value => 18, format => 'mp4'}, # mp4 (v-a) ], - '240' => [ - {value => 242, format => 'webm', dash => 1}, # webm (v) - {value => 133, format => 'mp4', dash => 1}, # mp4 (v) - {value => 395, format => 'av1', dash => 1}, # av1 (v) - {value => 6, format => 'flv'}, # flv (270p) (v-a) - {value => 5, format => 'flv'}, # flv (v-a) - {value => 36, format => '3gp'}, # 3gp (v-a) - {value => 13, format => '3gp'}, # 3gp (v-a) - {value => 92, format => 'mp4', live => 1}, # mp4 (live) (v-a) - {value => 132, format => 'ts', live => 1}, # ts (live) (v-a) + '240' => [{value => 242, format => 'webm', dash => 1}, # webm (v) + {value => 133, format => 'mp4', dash => 1}, # mp4 (v) + {value => 395, format => 'av1', dash => 1}, # av1 (v) + {value => 6, format => 'flv'}, # flv (270p) (v-a) + {value => 5, format => 'flv'}, # flv (v-a) + {value => 36, format => '3gp'}, # 3gp (v-a) + {value => 13, format => '3gp'}, # 3gp (v-a) + {value => 92, format => 'mp4', live => 1}, # mp4 (live) (v-a) + {value => 132, format => 'ts', live => 1}, # ts (live) (v-a) ], - '144' => [ - {value => 278, format => 'webm', dash => 1}, # webm (v) - {value => 160, format => 'mp4', dash => 1}, # mp4 (v) - {value => 394, format => 'av1', dash => 1}, # av1 (v) - {value => 17, format => '3gp'}, # 3gp (v-a) - {value => 91, format => 'mp4'}, # mp4 (live) (v-a) - {value => 151, format => 'ts'}, # ts (live) (v-a) + '144' => [{value => 278, format => 'webm', dash => 1}, # webm (v) + {value => 160, format => 'mp4', dash => 1}, # mp4 (v) + {value => 394, format => 'av1', dash => 1}, # av1 (v) + {value => 17, format => '3gp'}, # 3gp (v-a) + {value => 91, format => 'mp4'}, # mp4 (live) (v-a) + {value => 151, format => 'ts'}, # ts (live) (v-a) ], 'audio' => [{value => 172, format => 'webm', kbps => 192}, # webm (192 kbps) - {value => 251, format => 'webm', kbps => 160}, # webm opus (128-160 kbps) + {value => 251, format => 'opus', kbps => 160}, # webm opus (128-160 kbps) {value => 171, format => 'webm', kbps => 128}, # webm vorbis (92-128 kbps) - {value => 140, format => 'mp4', kbps => 128}, # mp4a (128 kbps) - {value => 141, format => 'mp4', kbps => 256}, # mp4a (256 kbps) - {value => 250, format => 'webm', kbps => 64}, # webm opus (64 kbps) - {value => 249, format => 'webm', kbps => 48}, # webm opus (48 kbps) - {value => 139, format => 'mp4', kbps => 48}, # mp4a (48 kbps) + {value => 140, format => 'm4a', kbps => 128}, # mp4a (128 kbps) + {value => 141, format => 'm4a', kbps => 256}, # mp4a (256 kbps) + {value => 250, format => 'opus', kbps => 64}, # webm opus (64 kbps) + {value => 249, format => 'opus', kbps => 48}, # webm opus (48 kbps) + {value => 139, format => 'm4a', kbps => 48}, # mp4a (48 kbps) ], }; } @@ -178,6 +170,10 @@ sub _find_streaming_url { $args{hfr} || next; # skip high frame rate (HFR) videos } + if ($itag->{format} eq 'av1') { + $args{ignore_av1} && next; # ignore videos in AV1 format + } + if ($itag->{dash}) { $args{dash} || next; @@ -193,8 +189,8 @@ sub _find_streaming_url { } if ($resolution eq 'audio' and not $args{dash_mp4_audio}) { - if ($itag->{format} eq 'mp4') { - next; # skip mp4 audio URLs + if ($itag->{format} eq 'm4a') { + next; # skip m4a audio URLs } } |