X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=videosite%2FYouTubeGrabber.pm;h=9866c2757d6499f42a1f95f9b3c9021d933a6aed;hb=2e4c1c63603e09140a769bc3f89614f2cdd49629;hp=617b65dcd0199f78003ee11cc5ab600364dd42bd;hpb=52e764796e7967b984c2a916f60476722df37fde;p=videosite.git diff --git a/videosite/YouTubeGrabber.pm b/videosite/YouTubeGrabber.pm index 617b65d..9866c27 100644 --- a/videosite/YouTubeGrabber.pm +++ b/videosite/YouTubeGrabber.pm @@ -25,7 +25,7 @@ sub new { $self->{'NAME'} = 'youtube'; $self->{'PATTERNS'} = ['(http://(?:[-a-zA-Z0-9_.]+\.)*youtube.(?:com|de|co.uk)/watch\?(?:.+=.+&)*v=([-a-zA-Z0-9_]+))', '(http://(?:[-a-zA-Z0-9_.]+\.)*youtube.(?:com|de|co.uk)/v/([-a-zA-Z0-9_]+))']; - $self->{'_PARAMS'} = {'USERNAME' => ['', 'Username to use for YouTube login'], 'PASSWORD' => ['', 'Password to use for YouTube login']}; + $self->{'_PARAMS'} = {'QUALITY' => ['normal', 'Quality of the video to download. normal = standard resolution flash video, high = higher resolution flash video, h264 = high resolution MPEG4 video, hd = HD720 rsolution'], 'USERNAME' => ['', 'Username to use for YouTube login'], 'PASSWORD' => ['', 'Password to use for YouTube login']}; bless($self, $class); $self->_prepare_parameters(); @@ -46,6 +46,8 @@ sub _parse { my $ua = LWP::UserAgent->new('agent' => 'Mozilla/5.0'); my $r; my $videourl; + my $quality = $self->_getval('QUALITY'); + my $append = ''; $url =~ m|$pattern|; $url = $1; @@ -57,7 +59,15 @@ sub _parse { $metadata->{'TITLE'} = undef; $metadata->{'DLURL'} = undef; - $videourl = sprintf('http://www.youtube.com/watch?v=%s', $2); + if ($quality eq 'high') { + $append = '&fmt=6'; + } elsif ($quality eq 'h264') { + $append = '&fmt=18'; + } elsif ($quality eq 'hd') { + $append = '&fmt=22'; + } + + $videourl = sprintf('http://www.youtube.com/watch?v=%s%s', $2, $append); unless(defined($r = $ua->get($videourl))) { $self->error('Could not download %s', $url); @@ -73,7 +83,7 @@ sub _parse { return undef; } } - $content = $r->decoded_content(); + $content = $r->content(); $p = HTML::TokeParser->new(\$content); @@ -86,13 +96,13 @@ sub _parse { } elsif ('script' eq $tag->[0]) { $e = $p->get_text(); if ($e =~ m|/watch_fullscreen\?(.+)\x27|) { - my %args = map { split(/=/, $_, 2); } split(/&/, $1); - $metadata->{'DLURL'} = sprintf('http://www.youtube.com/get_video.php?video_id=%s&t=%s', - $metadata->{'ID'}, $args{'t'}); + my %args = map { split(/=/, $_, 2); } split(/&(?!amp;)/, $1); + $metadata->{'DLURL'} = sprintf('http://www.youtube.com/get_video.php?video_id=%s&t=%s%s', + $metadata->{'ID'}, $args{'t'}, $append); $self->debug('URL found: %s', $metadata->{'DLURL'}); } } elsif ('div' eq $tag->[0]) { - if ('errorBox' eq $tag->[1]->{'class'}) { + if (exists($tag->[1]->{'class'}) and ('errorBox' eq $tag->[1]->{'class'})) { $self->error("Could not get video data for youtube %s: %s", $metadata->{'ID'}, $p->get_trimmed_text()); return undef;