X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=videosite%2FYouTubeGrabber.pm;h=ca8f49bca57aefbf296e6e822b33b2fae1a4307c;hb=b211d3075c2cf9856a7440b90ba628a8191a095e;hp=90f547a6a7445d232f2e925a3001bd2a8b4d468a;hpb=ed8ef38443c6bc1d4512cd00db2a23f04496430f;p=videosite.git diff --git a/videosite/YouTubeGrabber.pm b/videosite/YouTubeGrabber.pm index 90f547a..ca8f49b 100644 --- a/videosite/YouTubeGrabber.pm +++ b/videosite/YouTubeGrabber.pm @@ -26,16 +26,28 @@ my %preflist = ( 'high' => [34, 35, 18, 37, 22, 6, 5, 38, 43], 'normal' => [6, 5, 34, 35, 18, 22, 37, 38, 43]); my %videoformats = ( + # Container/Video codec/Audio codec/Resolution 5 => 'FLV/Sorenson/MP3/240p', - 18 => 'MP4/H264/AAC/360p', - 22 => 'MP4/H264/AAC/720p', - 34 => 'FLV/H264/AAC/360p', - 35 => 'FLV/H264/AAC/480p', - 37 => 'MP4/H264/AAC/1080p', - 38 => 'MP4/H264/AAC/3072p', - 43 => 'WebM/VP8/Vorbis/360p', + 6 => 'FLV/Sorenson/MP3/270p', + 13 => '3GP/MPEG4-Visual/144p', # 0.5MBit + 17 => '3GP/MPEG4-Visual/144p', # 2MBit + 18 => 'MP4/H264/AAC/360p', # isommp42, Baseline + 22 => 'MP4/H264/AAC/720p', # isommp42, High + 34 => 'FLV/H264/AAC/360p', # Main + 35 => 'FLV/H264/AAC/480p', # Main + 37 => 'MP4/H264/AAC/1080p', # High + 38 => 'MP4/H264/AAC/3072p', # High + 43 => 'WebM/VP8/Vorbis/360p', 44 => 'WebM/VP8/Vorbis/480p', 45 => 'WebM/VP8/Vorbis/720p', + 46 => 'WebM/VP8/Vorbis/1080p/3D', # effective 540p + 82 => 'MP4/H264/AAC/360p/3D', # isomavc1mp42 + 83 => 'MP4/H264/AAC/240p/3D', # isomavc1mp42 + 84 => 'MP4/H264/AAC/720p/3D', # isomavc1mp42 + 85 => 'MP4/H264/AAC/1080p/3D', # isomavc1mp42, effective 540p + 100 => 'WebM/VP8/Vorbis/360p/3D', + 101 => 'WebM/VP8/Vorbis/480p/3D', + 102 => 'WebM/VP8/Vorbis/720p/3D', ); sub new { @@ -43,6 +55,8 @@ sub new { my $self = $class->SUPER::new(); $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_]+))', '(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_]+))', @@ -58,7 +72,8 @@ sub new { 'h264' => 'high resolution MPEG4 video', 'hd' => 'HD720 resolution'}], 'USERNAME' => ['', 'Username to use for YouTube login'], - 'PASSWORD' => ['', 'Password to use for YouTube login']}; + 'PASSWORD' => ['', 'Password to use for YouTube login'], + 'HTTPS' => [1, 'Whether to use HTTPS (if available) to connect to YouTube']}; bless($self, $class); $self->_prepare_parameters(); @@ -108,13 +123,12 @@ sub _parse_by_video_info { $metadata->{'SOURCE'} = $self->{'NAME'}; $metadata->{'TITLE'} = undef; $metadata->{'DLURL'} = undef; - $metadata->{'COOKIE'} = undef; $preflist = $preflist{$quality}; $self->debug("Quality: %s, preflist: [%s]", $quality, join(", ", @{$preflist})); - $videourl = sprintf('https://www.youtube.com/get_video_info?video_id=%s&eurl=%s', - $id, 'http%3A%2F%2Fwww%2Eyoutube%2Ecom%2F'); + $videourl = sprintf('%s://www.youtube.com/get_video_info?video_id=%s&eurl=%s', + $self->_getval('HTTPS')?'https':'http', $id, 'http%3A%2F%2Fwww%2Eyoutube%2Ecom%2F'); $self->debug("Video info URL: %s", $videourl); $r = $ua->get($videourl); @@ -127,7 +141,7 @@ sub _parse_by_video_info { $self->debug('Content from get_video_info: %s', $content); # Decode content - $content = { split /[&=]/, $content }; + $content = $self->decode_querystring($content); if ($content->{'status'} ne 'ok') { $self->debug("Non OK status code found: %s", $content->{'status'}); @@ -189,13 +203,12 @@ sub _parse_by_scrape { $metadata->{'SOURCE'} = $self->{'NAME'}; $metadata->{'TITLE'} = undef; $metadata->{'DLURL'} = undef; - $metadata->{'COOKIE'} = undef; $preflist = $preflist{$quality}; $self->debug("Quality: %s, preflist: [%s]", $quality, join(", ", @{$preflist})); - $videourl = sprintf('https://www.youtube.com/watch?v=%s', $id); + $videourl = sprintf('%s://www.youtube.com/watch?v=%s', $self->_getval('HTTPS')?'https':'http', $id); unless(defined($r = $ua->get($videourl))) { $self->error('Could not download %s', $url); @@ -206,7 +219,6 @@ sub _parse_by_scrape { $self->debug('Video requires age verification'); my @logindata = $self->__login($videourl, $ua); $r = $logindata[0]; - $metadata->{'COOKIE'} = $logindata[1]; unless(defined($r)) { $self->error('Could not log into YouTube'); return undef; @@ -475,7 +487,7 @@ sub _decode_url_encoded_fmt_stream_map { # # @data will be an array of hash references - @data = map { { map { $self->decode_hexurl($_) } split /[=&]/ } } split /,/, $data; + @data = map { { map { $self->decode_hexurl($_) } split /[&=]/ } } split /,/, $data; $self->debug("_decode_url_encoded_fmt_stream_map() decoded %s", Dumper(\@data)); # From each array entry, pick the itag and the url values and return that @@ -504,6 +516,11 @@ sub __pick_url { if (exists($urls->{$_})) { $self->debug("Selected URL with quality level %s", $_); $metadata->{'DLURL'} = $urls->{$_}; + if (exists($videoformats{$_})) { + $metadata->{'FORMAT'} = $videoformats{$_}; + } else { + $metadata->{'FORMAT'} = 'unknown'; + } last; } }