22 => 'MP4/H264/AAC/720p', # isommp42, High
34 => 'FLV/H264/AAC/360p', # Main
35 => 'FLV/H264/AAC/480p', # Main
+ 36 => '3GP/MPEG4-Visual/240p',
37 => 'MP4/H264/AAC/1080p', # High
38 => 'MP4/H264/AAC/3072p', # High
43 => 'WebM/VP8/Vorbis/360p',
$self->{'NAME'} = 'youtube';
$self->{_SELFTESTURL} = 'http://www.youtube.com/watch?v=dMH0bHeiRNg';
$self->{_SELFTESTTITLE} = 'Evolution of Dance - By Judson Laipply';
- $self->{'PATTERNS'} = ['(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/watch(?:_popup)?\?(?:.+=.+&|&)*v=([-a-zA-Z0-9_]+))',
+ $self->{'PATTERNS'} = ['(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/watch(?:_popup)?\?.*?v=([-a-zA-Z0-9_]+))',
'(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/watch\#\!v=([-a-zA-Z0-9_]+))',
'(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/v/([-a-zA-Z0-9_]+))',
+ '(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/embed/([-a-zA-Z0-9_]+))',
'(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/user/[[:alnum:]]+\?v=([-a-zA-Z0-9_]+))',
'(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/(?:user/)?[[:alnum:]]+#p/(?:\w+/)+\d+/([-a-zA-Z0-9_]+))',
'(https?://(?:[-a-zA-Z0-9_.]+\.)*youtu\.be/watch\?v=([-a-zA-Z0-9_]+))',
$e = $p->get_text();
$self->debug("Found script: %s", $e);
- if ($e =~ m|\x27SWF_ARGS\x27:\s+(.+),|) {
- my $args = $1;
-
- $self->debug("Found SWF_ARGS: %s", $args);
- $jsp = videosite::JSArrayParser->new();
- $self->debug("Using %s to parse", ref($jsp));
- $r = $jsp->parse($args);
-
- unless(defined($r)) {
- $self->error("Found information hash, but could not parse");
- return undef;
- }
-
- if (exists($r->{'fmt_url_map'}) and ($r->{'fmt_url_map'} ne '')) {
- my $urls = $r->{'fmt_url_map'};
-
- $self->debug("Video has fmt_url_map: %s", $urls);
-
- $urls = $self->decode_hexurl($urls);
- %urls = split(/[\|,]/, $urls);
- $self->debug("Pagetype: old (SWF_ARGS), fmt_url_map");
-
- } elsif (exists($r->{'t'}) and ($r->{'t'} ne '')) {
- my $thash = $r->{'t'};
-
- if (exists($r->{'fmt_map'}) && ($r->{'fmt_map'} ne '')) {
- my $fmt = $r->{'fmt_map'};
- my @fmt;
-
- $self->debug('Video has fmt_map');
- $fmt = $self->decode_hexurl($fmt);
- @fmt = split(/,/, $fmt);
- foreach (@fmt) {
- @_=split(/\//);
- $urls{$_[0]} = sprintf('http://www.youtube.com/get_video?video_id=%s&fmt=%d&t=%s',
- $metadata->{'ID'},
- $_[0],
- $thash);
- }
- $self->debug("Pagetype: 2009 (SWF_ARGS), t with fmt_map");
-
- } else {
- $urls{5} = sprintf('http://www.youtube.com/get_video?video_id=%s&t=%s',
- $metadata->{'ID'},
- $thash);
- $self->debug("Pagetype: 2009 (SWF_ARGS), t without fmt_map");
- }
- } else {
- $self->error('Neither fmt_url_map nor t found in video information hash');
- return undef;
- }
- } elsif ($e =~ m|var swfHTML = .*fmt_url_map=([^\&]+)\&|) {
- my $urls = $1;
- $self->debug("Video has fmt_url_map: %s", $urls);
-
- $urls = $self->decode_hexurl($urls);
- %urls = split(/[\|,]/, $urls);
- $self->debug("Pagetype: 2010 (swfHTML), fmt_url_map");
- } elsif ($e =~ m|\x27PLAYER_CONFIG\x27:\s+(.+)(?:\}\);)?|) {
+ if ($e =~ m|ytplayer\.config\s*=\s*(.+);$|) {
my $args = $1;
$self->debug("Found PLAYER_CONFIG: %s", $args);
my $data = shift;
my $dataencoded = shift;
my @data;
+ my $h = {};
$data = $self->decode_hexurl($data) if $dataencoded;
# This will
# From each array entry, pick the itag and the url values and return that
# as a hash reference
- return { map { $_->{'itag'}, $_->{'url'} } @data };
+
+ foreach (@data) {
+ if (exists($_->{'sig'})) {
+ $h->{$_->{'itag'}} = sprintf('%s&signature=%s', $_->{'url'}, $_->{'sig'});
+ } else {
+ $h->{$_->{'itag'}} = $_->{'url'};
+ }
+ }
+
+ return $h;
}