Author: sparky
Date: Sun Apr 18 15:05:33 2010
New Revision: 11335

Modified:
   toys/rsget.pl/Video/YouTube
Log:
- implemented robust video format detection. getter is now able
  to download videos which don't have format 18


Modified: toys/rsget.pl/Video/YouTube
==============================================================================
--- toys/rsget.pl/Video/YouTube (original)
+++ toys/rsget.pl/Video/YouTube Sun Apr 18 15:05:33 2010
@@ -25,9 +25,38 @@
                [ 18, "mp4", "LQ" ],
        );
 
+       sub best_format
+       {
+               /"fmt_map"\s*:\s*"(.*?)"/ or m{&fmt_map=(\S+?)&}
+                       or return undef;
+               my %fmts = map { m{(\d+)/}; $1 => $_ } split ",", uri_unescape( 
$1 );
+
+               foreach my $f ( @fmt ) {
+                       return $f
+                               if exists $fmts{ $f->[0] };
+               }
+
+               return undef;
+       }
 start:
        GET( $-{_uri} );
 
+       ERROR( "file cannot be accessed" )
+               if /<div id="" class="yt-alert-content">/;
+
+       # try to find best format
+       $-{fmt} = best_format();
+
+       # format 18 is almost always hidden,
+       # if the best format we found is 5 we check for 18 manually
+       GOTO stage_got_format
+               if $-{fmt};
+
+       GET( "$-{_uri}&fmt=18" );
+
+       $-{fmt} = best_format();
+
+stage_got_format:
        ! m{"video_id": "(.*?)"} or m{'VIDEO_ID': '(.*?)'};
        my $id = $1;
 
@@ -35,24 +64,17 @@
        my $name = de_ml( de_ml( $1 ) );
        $name =~ s{/}{_}g;
 
-       ! /"fmt_map"\s*:\s*"(.*?)"/ or m{&fmt_map=(\S+?)&};
-       my %fmts = map { m{(\d+)/}; $1 => $_ } split ",", uri_unescape( $1 );
-
-       my $fmt = $fmt[ $#fmt ];
-       foreach my $f ( @fmt ) {
-               if ( exists $fmts{ $f->[0] } ) {
-                       $fmt = $f;
-                       last;
-               }
-       }
-
        ! /"t"\s*:\s*"(.*?)"/ or m{&t=(\S+?)&};
        my $t = $1;
 
+       my $fmt = $-{fmt};
+       my $fmtstr = $fmt ? "&fmt=$fmt->[0]" : "";
+       $fmt //= [ 5, "flv", "vLQ" ];
+
        my $fname = $name . "." . $fmt->[1];
        INFO( name => $fname, fmt => $fmt->[0], quality => $fmt->[2] );
 
-       DOWNLOAD( 
"http://youtube.com/get_video?video_id=$id&t=$t&fmt=$fmt->[0]",
+       DOWNLOAD( "http://youtube.com/get_video?video_id=$id&t=$t$fmtstr";,
                fname => $fname );
 
 # vim: filetype=perl:ts=4:sw=4
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to