Merge branch 'rertzinger/generic-load-save' into weechat
[videosite.git] / videosite / YouTubeGrabber.pm
index bacc644..28f5007 100644 (file)
@@ -53,34 +53,33 @@ my %videoformats = (
 
 sub new {
     my $class = shift;
-    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_]+))',
-                           '(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_]+))',
-                           '(https?://(?:[-a-zA-Z0-9_.]+\.)*youtu\.be/([-a-zA-Z0-9_]+))',
-                           '(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/user/\w+\?.*/([-a-zA-Z0-9_]+))'];
-    $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 resolution'}],
-            'USERNAME' => ['', 'Username 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();
-
-    return $self;
+    my $self = $class->SUPER::new(
+        NAME => 'youtube',
+        _SELFTESTURL => 'http://www.youtube.com/watch?v=dMH0bHeiRNg',
+        _SELFTESTTITLE => 'Evolution of Dance - By Judson Laipply',
+        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_]+))',
+                     '(https?://(?:[-a-zA-Z0-9_.]+\.)*youtu\.be/([-a-zA-Z0-9_]+))',
+                     '(https?://(?:[-a-zA-Z0-9_.]+\.)*youtube\.(?:com|de|co.uk)/user/\w+\?.*/([-a-zA-Z0-9_]+))'],
+        _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 resolution'}],
+            USERNAME => ['', 'Username to use for YouTube login'],
+            PASSWORD => ['', 'Password to use for YouTube login'],
+            HTTPS => [1, 'Whether to use HTTPS (if available) to connect to YouTube']
+        },
+        @_,
+    );
+
+    return bless($self, $class);
 }
 
 sub _parse {
@@ -246,66 +245,7 @@ sub _parse_by_scrape {
             $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|\x27PLAYER_CONFIG\x27:\s+(.+)(?:\}\);)?|) {
+             if ($e =~ m|ytplayer\.config\s*=\s*(.+);$|) {
                 my $args = $1;
                 $self->debug("Found PLAYER_CONFIG: %s", $args);
 
@@ -508,6 +448,7 @@ sub _decode_url_encoded_fmt_stream_map {
     my $data = shift;
     my $dataencoded = shift;
     my @data;
+    my $h = {};
 
     $data = $self->decode_hexurl($data) if $dataencoded;
     # This will
@@ -523,7 +464,16 @@ sub _decode_url_encoded_fmt_stream_map {
     # 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;
 }