This file is indexed.

/usr/bin/youtube-playlists is in libwww-youtube-download-perl 0.40-1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl

eval 'exec /usr/bin/perl  -S $0 ${1+"$@"}'
    if 0; # not running under some shell
use strict;
use warnings;
use URI;
use URI::QueryParam;
use XML::TreePP;
use WWW::YouTube::Download;
use Getopt::Long qw(GetOptions :config bundling);
use Pod::Usage qw(pod2usage);
use Term::ANSIColor qw(colored);

my $api_url = 'http://gdata.youtube.com/feeds/api/playlists';

GetOptions(
    'v|verbose' => \my $verbose,
    'h|help'    => sub { pod2usage(exitval => 0, -noperldoc => 1, -verbose => 2) },
    'V|version' => sub { show_version() },
) or pod2usage(2);
pod2usage() unless @ARGV;

my $ua  = WWW::YouTube::Download->new->ua;
my $tpp = XML::TreePP->new;

main: {
    for my $id_or_url (@ARGV) {
        chatty("--> Works on %s\n", $id_or_url);
        my $id = find_playlist_id($id_or_url);
        throw('%s is not supported arguments', $id_or_url) unless $id;
        my $xml = fetch_playlist_xml($id);
        my $urls = find_video_urls($xml);
        local $\ = "\n"; # auto print @_, "\n"
        print join "\n", @$urls;
    }
}

sub fetch_playlist_xml {
    my $id = shift;
    my $url = sprintf '%s/%s?v=2', $api_url, $id;
    chatty('Fetching %s ... ', $url);
    my $res = $ua->get($url);
    unless ($res->is_success) {
        throw('%s: %s', $id, $res->status_line);
    }
    chatty(colored ['green'], "done\n");
    return $res->decoded_content;
}

sub find_video_urls {
    my $xml = shift;
    my $urls = [];
    chatty('Parsing XML ... ');
    my $tree = $tpp->parse($xml);
    for my $entry (@{$tree->{feed}{entry}}) {
        my $uri = URI->new($entry->{'media:group'}{'media:player'}{-url});
        $uri->query_param_delete('feature');
        push @$urls, $uri->as_string;
    }
    chatty(colored ['green'], "done\n");
    return $urls;
}

sub find_playlist_id {
    my $id_or_url = shift || return;
    if ($id_or_url =~ /^http/) {
        ($id_or_url) = $id_or_url =~ m/list=PL([0-9A-F]+)/;
    }
    else {
        $id_or_url =~ s/^PL//;
    }
    return $id_or_url;
}

sub throw {
    my $format = shift;
    die colored ['red'], sprintf($format, @_), "\n";
}

sub chatty {
    return unless $verbose;
    my $format = shift;
    print STDERR sprintf $format, @_;
}

sub show_version {
    print "youtube-playlists (WWW::YouTube::Download) version $WWW::YouTube::Download::VERSION\n";
    exit;
}
__END__

=head1 NAME

youtube-playlists - Find a YouTube video urls from playlis(s)

=head1 SYNOPSIS

  # print the list of video urls
  $ youtube-playlists http://www.youtube.com/watch?list=PLB199169FA7413767
  $ youtube-playlists PLB199169FA7413767
  $ youtube-playlists B199169FA7413767

  # with youtube-download
  $ youtube-playlists B199169FA7413767 | youtube-download

=head1 OPTIONS

=over

=item -v, --verbose

truns on chatty output

=item -h, --help

display help

=item -V, --version

display version

=back

=head1 AUTHOR

Yuji Shiamda (xaicron)