- Fixed and expanded quality selection
authorRalf Ertzinger <sun@ryoko-darknet.camperquake.de>
Fri, 14 Aug 2009 21:26:25 +0000 (23:26 +0200)
committerRalf Ertzinger <sun@ryoko-darknet.camperquake.de>
Fri, 14 Aug 2009 21:26:25 +0000 (23:26 +0200)
videosite/YouTubeGrabber.pm

index 37c5097..d6232a9 100644 (file)
@@ -15,6 +15,7 @@ use LWP::UserAgent;
 use HTTP::Cookies;
 use HTML::TokeParser;
 use Data::Dumper;
+use List::Util;
 
 use strict;
 
@@ -54,7 +55,12 @@ sub _parse {
     my $r;
     my $videourl;
     my $quality = $self->_getval('QUALITY');
-    my $append = '';
+    my %preflist = (
+        'hd' => [22, 35, 18, 34, 6, 5],
+        'h264' => [18, 34, 22, 35, 6, 5],
+        'high' => [34, 35, 18, 22, 6, 5],
+        'normal' => [6, 5, 34, 35, 18, 22]);
+    my $preflist;
 
     $url =~ m|$pattern|;
     $url = $1;
@@ -66,15 +72,10 @@ sub _parse {
     $metadata->{'TITLE'} = undef;
     $metadata->{'DLURL'} = undef;
 
-    if ($quality eq 'high') {
-        $append = '&fmt=6';
-    } elsif ($quality eq 'h264') {
-        $append = '&fmt=18';
-    } elsif ($quality eq 'hd') {
-        $append = '&fmt=22';
-    }
+    $preflist = $preflist{$quality};
+    $self->debug("Quality: %s, preflist: [%s]", $quality, join(", ", @{$preflist}));
 
-    $videourl = sprintf('http://www.youtube.com/watch?v=%s%s', $2, $append);
+    $videourl = sprintf('http://www.youtube.com/watch?v=%s', $2);
 
     unless(defined($r = $ua->get($videourl))) {
         $self->error('Could not download %s', $url);
@@ -107,20 +108,37 @@ sub _parse {
                 $self->debug("Found fmt_url_map: %s", $1);
                 my $urls = $1;
                 my @urls;
+                my %urls;
 
                 $urls =~ s/%(..)/chr(hex($1))/ge;
-                @urls = split(/\|/, $urls);
-
-                if ($urls[0] == 5) {
-                    $metadata->{'DLURL'} = $urls[1];
-                } elsif ($urls[0] == 18) {
-                    $metadata->{'DLURL'} = $urls[3];
-                } elsif ($urls[0] == 34) {
-                    $metadata->{'DLURL'} = $urls[2];
-                } else {
-                    $self->error("Unknown video type in fmt_url_map: %s", $urls[0]);
-                    next;
+                @urls = split(/,/, $urls);
+                foreach (@urls) {
+                    my ($tag, $url) = split(/\|/);
+                    if ($tag == 35) {
+                        $self->debug('Found flv,h264,large: %s', $url);
+                    } elsif ($tag == 34) {
+                        $self->debug('Found flv,h264: %s', $url);
+                    } elsif ($tag == 22) {
+                        $self->debug('Found mp4,h264,large: %s', $url);
+                    } elsif ($tag == 18) {
+                        $self->debug('Found mp4,h264: %s', $url);
+                    } elsif ($tag == 5) {
+                        $self->debug('Found flv,flv: %s', $url);
+                    } else {
+                        $self->error('Unknown tag %s: %s', $tag, $url);
+                        next;
+                    }
+                    $urls{$tag} = $url;
+                }
+
+                foreach (@{$preflist}) {
+                    if (exists($urls{$_})) {
+                        $self->debug("Selected URL with quality level %s", $_);
+                        $metadata->{'DLURL'} = $urls{$_};
+                        last;
+                    }
                 }
+
                 $self->debug('URL found: %s', $metadata->{'DLURL'});
             }
         } elsif ('div' eq $tag->[0]) {