X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=videosite%2FYouTubeGrabber.pm;h=d0455f9b98ba0a8a068065d9c3e2c5d951a01776;hb=206b1d1388939171bedd360ed7cd6527f45df02e;hp=97327bd3389f4c71df28221f45af1618290ea474;hpb=f2ffeb5224e7b897b89409ecba705ca85ae335ed;p=videosite.git diff --git a/videosite/YouTubeGrabber.pm b/videosite/YouTubeGrabber.pm index 97327bd..d0455f9 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 = ( - 43 => 'webm,360p', - 44 => 'webm,480p', - 45 => 'webm,720p', - 38 => 'mp4,h264,4k', - 37 => 'mp4,h264,1080p', - 35 => 'flv,h264,large', - 34 => 'flv,h264', - 22 => 'mp4,h264,720p', - 18 => 'mp4,h264', - 5 => 'flv,flv', + # Container/Video codec/Audio codec/Resolution + 5 => 'FLV/Sorenson/MP3/240p', + 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 { @@ -58,7 +70,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(); @@ -113,8 +126,8 @@ sub _parse_by_video_info { $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 +140,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'}); @@ -195,7 +208,7 @@ sub _parse_by_scrape { $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); @@ -475,7 +488,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 +517,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; } }