Hi, General improvements of the tool, previous patch integrated upstream:
http://cpansearch.perl.org/src/XAICRON/WWW-YouTube-Download-0.54/Changes also, new patch for better signatures support, sent upstream. Index: Makefile =================================================================== RCS file: /cvs/ports/www/p5-WWW-YouTube-Download/Makefile,v retrieving revision 1.10 diff -u -r1.10 Makefile --- Makefile 27 Apr 2013 14:29:08 -0000 1.10 +++ Makefile 8 Jul 2013 01:10:10 -0000 @@ -3,7 +3,7 @@ COMMENT = simple YouTube interface for downloading videos MODULES = cpan -DISTNAME = WWW-YouTube-Download-0.50 +DISTNAME = WWW-YouTube-Download-0.54 CATEGORIES = www MAINTAINER = Mikolaj Kucharski <miko...@kucharski.name> Index: distinfo =================================================================== RCS file: /cvs/ports/www/p5-WWW-YouTube-Download/distinfo,v retrieving revision 1.8 diff -u -r1.8 distinfo --- distinfo 27 Apr 2013 14:29:08 -0000 1.8 +++ distinfo 8 Jul 2013 01:10:10 -0000 @@ -1,2 +1,2 @@ -SHA256 (WWW-YouTube-Download-0.50.tar.gz) = n1w2E5c7wSdkGv7eroQcctZCPpXTzS8F9g0wqqYu9yE= -SIZE (WWW-YouTube-Download-0.50.tar.gz) = 19826 +SHA256 (WWW-YouTube-Download-0.54.tar.gz) = eq816OYty7oukfZZuw9XzqU6Ld2ubsIvx2czJYK34OM= +SIZE (WWW-YouTube-Download-0.54.tar.gz) = 21556 Index: patches/patch-lib_WWW_YouTube_Download_pm =================================================================== RCS file: /cvs/ports/www/p5-WWW-YouTube-Download/patches/patch-lib_WWW_YouTube_Download_pm,v retrieving revision 1.5 diff -u -r1.5 patch-lib_WWW_YouTube_Download_pm --- patches/patch-lib_WWW_YouTube_Download_pm 27 Apr 2013 14:29:09 -0000 1.5 +++ patches/patch-lib_WWW_YouTube_Download_pm 8 Jul 2013 01:10:10 -0000 @@ -1,15 +1,75 @@ -$OpenBSD: patch-lib_WWW_YouTube_Download_pm,v 1.5 2013/04/27 14:29:09 sthen Exp $ +$OpenBSD$ -- support one more url type +- better encoded signatures support, based on yt-dl.org ---- lib/WWW/YouTube/Download.pm.orig Fri Apr 19 18:50:43 2013 -+++ lib/WWW/YouTube/Download.pm Sat Apr 27 12:33:16 2013 -@@ -271,7 +271,7 @@ sub _suffix { +--- lib/WWW/YouTube/Download.pm.orig Fri Jul 5 19:29:59 2013 ++++ lib/WWW/YouTube/Download.pm Mon Jul 8 01:45:43 2013 +@@ -244,25 +244,43 @@ sub _parse_fmt_map { + return $fmt_map; + } - sub _video_id { - my $stuff = shift; -- if ($stuff =~ m{/.*?[?&;!]v=([^&#?=/;]+)}) { -+ if ($stuff =~ m{/.*?[?&;!](?:v|video_id)=([^&#?=/;]+)}) { - return $1; +-sub _swapelement { +- my ($pos, @list) = @_; +- my $first = $list[0]; +- my $other = $list[$pos % scalar(@list)]; +- $list[0] = $other; +- $list[$pos] = $first; +- return @list; ++sub _sigdecode { ++ my @s = @_; ++ ++ # based on youtube_dl/extractor/youtube.py from yt-dl.org ++ if (@s == 88) { ++ return ($s[48], reverse(@s[68..81]), $s[82], reverse(@s[63..66]), $s[85], ++ reverse(@s[49..61]), $s[67], reverse(@s[13..47]), $s[3], ++ reverse(@s[4..11]), $s[2], $s[12]); ++ } elsif (@s == 87) { ++ return ($s[62], reverse(@s[63..82]), $s[83], reverse(@s[53..61]), $s[0], ++ reverse(@s[3..51])); ++ } elsif (@s == 86) { ++ return (@s[2..62], $s[82], @s[64..81], $s[63]); ++ } elsif (@s == 85) { ++ return ($s[76], reverse(@s[77..82]), $s[83], reverse(@s[61..75]), $s[0], ++ reverse(@s[51..59]), $s[1], reverse(@s[3..49])); ++ } elsif (@s == 84) { ++ return (reverse(@s[37..83]), $s[2], reverse(@s[27..35]), $s[3], ++ reverse(@s[4..25]), $s[26]); ++ } elsif (@s == 83) { ++ return ($s[52], reverse(@s[56..81]), $s[2], reverse(@s[53..54]), $s[82], ++ reverse(@s[37..51]), $s[55], reverse(@s[3..35]), $s[36]); ++ } elsif (@s == 82) { ++ return ($s[36], reverse(@s[68..79]), $s[81], reverse(@s[41..66]), $s[33], ++ reverse(@s[37..39]), $s[40], $s[35], $s[0], $s[67], ++ reverse(@s[1..32]), $s[34]); ++ } ++ ++ return (); # fail + } + +-# taken from https://gist.github.com/anonymous/e40cb4a1ba3c71f16c05 +-sub _sigdecode { ++sub _getsig { + my $sig = shift; +- Carp::croak 'Unable to find signature.' unless $sig; +- my @sig = split(//, $sig); +- @sig = reverse(_swapelement(52, @sig)); +- @sig = @sig[3..$#sig]; +- @sig = reverse(_swapelement(21, @sig)); +- @sig = @sig[3..$#sig]; +- return join('', reverse(@sig)); ++ croak 'Unable to find signature' unless $sig; ++ my @sig = _sigdecode(split(//, $sig)); ++ croak "Unable to decode signature $sig" unless @sig; ++ return join('', @sig); + } + + sub _parse_stream_map { +@@ -272,7 +290,7 @@ sub _parse_stream_map { + my $uri = URI->new; + $uri->query($stuff); + my $query = +{ $uri->query_form }; +- my $sig = $query->{sig} || _sigdecode($query->{s}); ++ my $sig = $query->{sig} || _getsig($query->{s}); + my $url = $query->{url}; + $fmt_url_map->{$query->{itag}} = $url.'&signature='.$sig; } - elsif ($stuff =~ m{/(?:e|v|embed)/([^&#?=/;]+)}) { -- best regards q#