Skip to content

Commit 2677cdd

Browse files
committed
- Support for :page=i along with :beg and :end in watched videos context (-wv).
1 parent 7e41be0 commit 2677cdd

File tree

1 file changed

+63
-22
lines changed

1 file changed

+63
-22
lines changed

bin/youtube-viewer

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

29012895
sub 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

29062911
sub 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

Comments
 (0)