YouTube: Correctly parse url_encoded_fmt_stream_map from the web scape, too
[videosite.git] / videosite / GoogleGrabber.pm
index 7d9cad6..a33f027 100644 (file)
@@ -3,10 +3,10 @@
 #
 # Grabber for video.google.com
 
-package GoogleGrabber;
+package videosite::GoogleGrabber;
 
-use GrabberBase;
-@ISA = qw(GrabberBase);
+use videosite::GrabberBase;
+@ISA = qw(videosite::GrabberBase);
 
 use LWP::Simple qw(!get);
 use HTML::TokeParser;
@@ -20,6 +20,7 @@ sub new {
 
     $self->{'NAME'} = 'google';
     $self->{'PATTERNS'} = ['(http://video\.google\.com/videoplay\?docid=([-\d]+))'];
+    $self->{'_PARAMS'} = {'QUALITY' => ['normal', 'Quality of the video to download. normal = standard resolution flash video, h264 = high resolution MPEG4 video']};
 
     bless($self, $class);
     $self->_prepare_parameters();
@@ -35,6 +36,7 @@ sub _parse {
     my $metadata = {};
     my $p;
     my $e;
+    my $quality = $self->_getval('QUALITY');
 
     $url =~ m|$pattern|;
     $url = $1;
@@ -56,13 +58,24 @@ sub _parse {
     # Look for the title
     if ($p->get_tag('title')) {
         $metadata->{'TITLE'} = $p->get_text();
-        $metadata->{'TITLE'} =~ s/ - Google Video$//;
+        $metadata->{'TITLE'} =~ s/\s?- Google Video$//s;
     }
 
-    while ($e = $p->get_tag('a')) {
-        if ((exists($a->[1]{'id'})) and ('ipoddownloadlink' eq $a->[1]{'id'})) {
-            $metadata->{'DLURL'} = $a->[1]{'href'};
-            last;
+    if ($quality eq 'h264') {
+        while ($e = $p->get_tag('a')) {
+            if ((exists($e->[1]{'id'})) and ('ipoddownloadlink' eq $e->[1]{'id'})) {
+                $metadata->{'DLURL'} = $e->[1]{'href'};
+                last;
+            }
+        }
+    } else {
+        while ($e = $p->get_tag('script')) {
+            if ($p->get_text() =~ m|googleplayer\.swf\?\\46videoUrl\\75(.+?)\\46|s) {
+                my $u = $1;
+                $u =~ s/%(..)/chr(hex($1))/ge;
+                $metadata->{'DLURL'} = $u;
+                last;
+            }
         }
     }