@@ -2848,59 +2848,64 @@ sub update_channel_file {
28482848 close $fh ;
28492849}
28502850
2851- sub get_watched_videos_from_file {
2852- my ($page ) = @_ ;
2851+ sub get_videos_from_list {
2852+ my ($ids , $ page ) = @_ ;
28532853
28542854 $page //= $yv_obj -> get_page;
28552855
2856- my @ids ;
2857-
2858- if ($opt {watch_history } and open (my $fh , ' <' , $opt {watch_history_file })) {
2859- chomp (@ids = <$fh >);
2860- close $fh ;
2861- }
2862- else {
2863- @ids = keys %WATCHED_VIDEOS ;
2864- }
2856+ my @ids = @$ids ;
28652857
28662858 my %seen ;
28672859
28682860 # Keep the most recent ones
28692861 @ids = reverse (@ids );
28702862 @ids = grep { !$seen {$_ }++ } @ids ;
28712863
2872- my $maxResults = $yv_obj -> get_maxResults;
2864+ my $maxResults = $yv_obj -> get_maxResults;
2865+ my $totalResults = scalar (@ids );
28732866
28742867 if ($page >= 1 and scalar (@ids ) >= $maxResults ) {
28752868
28762869 @ids = grep { defined } @ids [($page - 1) * $maxResults .. $page * $maxResults - 1];
28772870
28782871 if (!@ids ) {
28792872 warn_last_page();
2880- return get_watched_videos_from_file( $page - 1) if ($page > 1);
2873+ return __SUB__ -> ( $ids , $page - 1) if ($page > 1);
28812874 }
28822875 }
28832876
28842877 my %results ;
28852878 my @videos ;
28862879
28872880 foreach my $id (@ids ) {
2888- push @videos , {id => {kind => " youtube#video" , videoId => $id }, };
2881+ push @videos , {id => {kind => " youtube#video" , videoId => $id }};
28892882 }
28902883
28912884# <<<
28922885 $results {items } = \@videos ;
2893- $results {pageInfo } = {resultsPerPage => scalar (@videos ), totalResults => scalar (@videos )};
2894- $results {nextPageToken } = sub { get_watched_videos_from_file($page + 1) };
2895- $results {prevPageToken } = sub { get_watched_videos_from_file(($page > 1) ? ($page - 1) : do { warn_first_page(); 1 }) };
2886+ $results {pageInfo } = {resultsPerPage => scalar (@videos ), totalResults => $totalResults };
2887+ $results {fromPage } = sub { get_videos_from_list($ids , $_ [0]) };
2888+ $results {nextPageToken } = sub { get_videos_from_list($ids , $page + 1) };
2889+ $results {prevPageToken } = sub { get_videos_from_list($ids , (($page > 1) ? ($page - 1) : do { warn_first_page(); 1 })) };
28962890# >>>
28972891
28982892 scalar {results => \%results , url => undef };
28992893}
29002894
29012895sub print_watched_videos_from_file {
29022896 my ($page ) = @_ ;
2903- print_videos(get_watched_videos_from_file($page ));
2897+
2898+ my @ids ;
2899+
2900+ if ($opt {watch_history } and open (my $fh , ' <' , $opt {watch_history_file })) {
2901+ chomp (@ids = <$fh >);
2902+ close $fh ;
2903+ }
2904+ else {
2905+ @ids = sort keys %WATCHED_VIDEOS ;
2906+ }
2907+
2908+ print_videos(get_videos_from_list(\@ids , $page ));
29042909}
29052910
29062911sub print_channels_from_file {
@@ -3325,6 +3330,7 @@ sub parse_page_number {
33253330 elsif ($page_number =~ / last|end/ ) {
33263331
33273332 if (ref ($info -> {pageInfo }) eq ' HASH' ) {
3333+
33283334 my $total = $info -> {pageInfo }{totalResults };
33293335 my $per_page = $info -> {pageInfo }{resultsPerPage };
33303336
@@ -4217,13 +4223,28 @@ sub print_videos {
42174223 print $complete_help ;
42184224 press_enter_to_continue();
42194225 }
4226+
4227+ # :page=i, :end, :beg, :last, :first
42204228 elsif ($opt =~ / ^(page=(\S +)\z |(last|end|beg|first))/ ) {
4229+
42214230 my $page_number = parse_page_number($+ , $info );
42224231 say " \n :: Jumping to page $page_number " if ($page_number > 1);
4223- my $page_token = $yv_obj -> page_token($page_number );
4224- my $request = $yv_obj -> from_page_token($url , $page_token );
4225- __SUB__ -> ($request , @keywords ? (auto => 1) : ());
4232+
4233+ if (defined ($url )) {
4234+ my $page_token = $yv_obj -> page_token($page_number );
4235+ my $request = $yv_obj -> from_page_token($url , $page_token );
4236+ __SUB__ -> ($request , @keywords ? (auto => 1) : ());
4237+ }
4238+ elsif (defined ($info -> {fromPage }) and ref ($info -> {fromPage }) eq ' CODE' ) {
4239+ my $request = $info -> {fromPage }-> ($page_number );
4240+ __SUB__ -> ($request , @keywords ? (auto => 1) : ());
4241+ }
4242+ else {
4243+ warn_no_results(' page' );
4244+ }
42264245 }
4246+
4247+ # :next
42274248 elsif ($opt =~ / ^(?:n|next)\z / ) {
42284249 if (defined $info -> {nextPageToken }) {
42294250 my $request = $yv_obj -> from_page_token($url , $info -> {nextPageToken });
@@ -4238,6 +4259,8 @@ sub print_videos {
42384259 }
42394260 }
42404261 }
4262+
4263+ # :back, :previous
42414264 elsif ($opt =~ / ^(?:b|back|p|prev|previous)\z / ) {
42424265 if (defined $info -> {prevPageToken }) {
42434266 __SUB__ -> ($yv_obj -> from_page_token($url , $info -> {prevPageToken }), @keywords ? (auto => 1) : ());
@@ -4246,13 +4269,19 @@ sub print_videos {
42464269 warn_first_page();
42474270 }
42484271 }
4249- elsif ($opt =~ / ^(?:R|refresh)\z / ) {
4272+
4273+ # :refresh
4274+ elsif ($opt =~ / ^(?:R|refresh)\z / and defined ($url )) {
42504275 @{$videos } = @{$yv_obj -> _get_results($url )-> {results }{items }};
42514276 $results -> {has_extra_info } = 0;
42524277 }
4278+
4279+ # :return
42534280 elsif ($opt =~ / ^(?:r|return)\z / ) {
42544281 return ;
42554282 }
4283+
4284+ # :author=i, :u=i
42564285 elsif ($opt =~ / ^(?:a|author|u|uploads)${digit_or_equal_re} (.*)/ ) {
42574286 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
42584287 foreach my $id (@nums ) {
@@ -4270,6 +4299,8 @@ sub print_videos {
42704299 warn_no_thing_selected(' video' );
42714300 }
42724301 }
4302+
4303+ # :save=i
42734304 elsif ($opt =~ / ^(?:s|save)${digit_or_equal_re} (.*)/ ) {
42744305 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
42754306 foreach my $id (@nums ) {
@@ -4287,6 +4318,8 @@ sub print_videos {
42874318 warn_no_thing_selected(' video' );
42884319 }
42894320 }
4321+
4322+ # :popular=i, :pv=i
42904323 elsif ($opt =~ / ^(?:pv|popular)${digit_or_equal_re} (.*)/ ) {
42914324 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
42924325 foreach my $id (@nums ) {
@@ -4304,6 +4337,8 @@ sub print_videos {
43044337 warn_no_thing_selected(' video' );
43054338 }
43064339 }
4340+
4341+ # :activity
43074342 elsif ($opt =~ / ^(?:A|[Aa]ctivity)${digit_or_equal_re} (.*)/ ) {
43084343 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
43094344 foreach my $id (@nums ) {
@@ -4321,6 +4356,8 @@ sub print_videos {
43214356 warn_no_thing_selected(' activity' );
43224357 }
43234358 }
4359+
4360+ # :ps
43244361 elsif ($opt =~ / ^(?:ps|s2p)${digit_or_equal_re} (.*)/ ) {
43254362 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
43264363 select_and_save_to_playlist(map { $yv_utils -> get_video_id($videos -> [$_ ]) } @nums );
@@ -4329,6 +4366,8 @@ sub print_videos {
43294366 warn_no_thing_selected(' video' );
43304367 }
43314368 }
4369+
4370+ # :p=i, :playlist=i, :up=i
43324371 elsif ($opt =~ / ^(?:p|playlists?|up)${digit_or_equal_re} (.*)/ ) {
43334372 if (my @nums = get_valid_numbers($# {$videos }, $1 )) {
43344373 foreach my $id (@nums ) {
@@ -4345,6 +4384,8 @@ sub print_videos {
43454384 warn_no_thing_selected(' video' );
43464385 }
43474386 }
4387+
4388+ # :like=i, :dislike=i
43484389 elsif ($opt =~ / ^((?:dis)?like)${digit_or_equal_re} (.*)/ ) {
43494390 my $rating = $1 ;
43504391 if (my @nums = get_valid_numbers($# {$videos }, $2 )) {
0 commit comments