2010年2月27日 星期六

youtube catcher

  1. 現在市面有很多youtube的Download軟體,本來以為只要打開網頁原始檔就可以看到連結位置,可能是我想法太天真了..呵呵.這裡就拿別人已經寫好的code 當例子講解一下要如何download. 程式碼跟原理主要參考 Ref: http://www.catonmat.net/blog/downloading-youtube-videos-with-a-perl-one-liner/
  2. 其實主要還是透過封包分析出規則,首先youtube會建立個mirror的網址這個是我們一般所看到的http://www.youtube.com/後面接的是影片的資訊,如下http://www.youtube.com/watch?v=5f-MYl-HzNw&feature 我們點入後,他會定義好要回傳給Server所要的值,如width="425" height="350"...還有影片的檔名. Server的位置在http://youtube.com/get_video?video_id=$_&t=$t, 很明顯可以看到影片所存在的位置,透過 Wget or WWW::Mechanize 的方式把影片抓回到 local
  3. sample code from http://www.catonmat.net/blog/downloading-youtube-videos-with-a-perl-one-liner/
use WWW::Mechanize;
use Number::Bytes::Human qw(format_bytes);

for (@ARGV) {
    s{http://www\.youtube\.com/watch\?v=}{}g;

    $m = WWW::Mechanize->new;
    $m->get("http://www.youtube.com/watch?v=$_&gl=US&hl=en");
    ($t) = $m->content =~ /, "t": "([^"]+)"/;

    open $f, "> $_.flv";
    binmode $f;

    $m->get(
        "http://youtube.com/get_video?video_id=$_&t=$t",
        ':content_cb' => sub {
            ($c, $r) = @_;
            $b += length($c);
            if ($r->content_length) {
                printf STDERR "$_: %.2f%%: %s of %s            \r",
                    100. * $b / $r->content_length,
                    format_bytes($b),
                    format_bytes($r->content_length);
            }
            print $f $c;
        });

    $b = 0;
    print "\n";
    close $f;
}

4.執行結果,在console下鍵入 %perl youtub.pl http://www.youtube.com/watch?v=5f-MYl-HzNw&feature=fvsr 下載完後請用 KMPlayer來撥放.

沒有留言:

張貼留言