2010-06-29

【PHP】下載 YouTube 影片

1 comments

常常覺的Youtube上的影片有些還真有趣,

就會想要下載下來,以後無聊可以看看。

所以就研究了一下怎麼寫。

其實程式不難,短短的就可以搞定了。

下面就貼上我亂寫的一些Code。

第一種方式,是使用 get_video_info 來取得影片資訊,進而拿到token ,取得影片路徑。

function doHttpRequest($url) {
    $ch = curl_init();
    $header[] = "Cache-Control: no-cache";
    $header[] = "Pragma: no-cache";
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
    curl_setopt($ch, CURLOPT_TIMEOUT, 4);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);

    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$url = 'http://www.youtube.com/watch?v=q_gfD3nvh-8';
// video_id
$key = explode("v=",$url);
$key = $key[1];

$content = doHttpRequest("http://youtube.com/get_video_info?video_id=".$key);

$a = explode('&', $content);  
$info = array();
foreach($a as $item){
    $tmp = explode('=', $item);
    $info[$tmp[0]] = urldecode($tmp[1]);
}
$token = $info['token'];
$url= 'http://www.youtube.com/get_video?fmt=18\&video_id='.$key.'\&t='.$token;
$cmd = '/usr/bin/wget '.$url. ' -O /tmp/'.$key;

system($cmd, $ret_val);
echo $ret_val; // 回0表正常抓到檔案。 

但第一種方式會有一個缺點,就是當影片有限制時,會有錯誤,例如回傳下列錯誤訊息。

array(3) { ["status"]=>  string(4) "fail" ["errorcode"]=>  string(3) "150" ["reason"]=>  string(90) "這部影片含有 SM Entertainment 所擁有的內容,禁止在特定網站上播放。" }

所以這時候,可以改成用下列這種方式來抓影片,這個方式是直接把Youtube的播放頁Html全部抓回來,

然後取得所要的token及相關資訊,程式如下:

$url = 'http://www.youtube.com/watch?v=q_gfD3nvh-8';
// 取得 video id, 必要
$key = explode("v=",$url);
$key = $key[1];

$txt = urldecode(file_get_contents($url));
// 取得 title, 非必要
preg_match('/
$title = substr($title[0], 28, -2);
// 取得 keywords, 非必要
preg_match('/
$keywords = substr($keywords[0], 31, -2);
// 取得 token, 必要
preg_match('/&t=[\w-=_]+/',$txt,$t_temp);
$t = substr($t_temp[0], 3);

$url= 'http://www.youtube.com/get_video?fmt=18\&video_id='.$key.'\&t='.$t;
$cmd = '/usr/bin/wget '.$file. ' -O /tmp/'.$key;
system($cmd, $ret_val);
echo $ret_val; // 回0表正常抓到檔案。

所以基本上只要用第二種方式,就可以了抓到影片了。

不過我不太會regExp,所以寫的有點…暴力……

以上~~

 

 

附上 fmt 資訊 ( 來源:一次搞懂十種YouTube格式 )

※影片格式與&fmt參數對應

  • MP4格式:&fmt=18、22、37
  • 3GP格式:&fmt=13、17
  • FLV格 式:其他皆是

※&fmt參數與影片規格對照

參數 檔案格式 影片大小 聲音格式 備註
&fmt=0 FLV 320 x 240 單聲道 22KHz MP3 與&fmt=5相同
&fmt=5 FLV 320 x 240 單聲道 44KHz MP3  
&fmt=6 FLV 480 x 360 單聲道 44KHz MP3  
&fmt=34 FLV 320 x 240 雙聲道 44KHz MP3 YouTube預設影片格式
&fmt=35 FLV 640 x 380 雙聲道 44KHz MP3  
&fmt=13 3GP 176 x 144 雙聲道 8KHz 適合小螢幕手機
&fmt=17 3GP 176 x 144 單聲道 22KHz 適合小螢幕手機
&fmt=18 MP4 480 x 360 雙聲道 44KHz AAC H.264編碼
&fmt=22 MP4 1280 x 720 雙聲道 44KHz AAC H.264編碼
&fmt=37 MP4 1920 x 1080 雙聲道 44KHz AAC H.264編碼

 

2010-08-05 更新:

不久前發現 http://www.youtube.com/get_video 這隻不能用了~

真的很麻煩,現在改成用 get_video_info 取得影片資訊,

然後 Parsing 裡面的 fmt_url_map ,取得各種格式的網址去下載。



PS. fmt_url_map 己經換成 url_encoded_fmt_stream_map。

2010-06-18

【系統】Squid : The request or reply is too large !!

0 comments

最近在用 Zend 的 FirePHP 來 Profile DB 的時候,常常都會出現上圖這個問題。

想來想去應該就是 Response Header 的資料量太大,才會這樣吧。

因為 FirePHP 會將資料塞在 Response Header 裡,正常狀況如下圖。

然後在Console 畫面就可以看到執行的SQL 語法。

可參考 : 【程式】ZF : DB Profiling with Firebug

 

現在就來說說怎麼解決這個問題吧:

ERROR

The requested URL could not be retrieved


While trying to retrieve the URL: http://xxx.com

The following error was encountered:

  • The request or reply is too large.

    If you are making a POST or PUT request, then your request body (the thing you are trying to upload) is too large. If you are making a GET request, then the reply body (what you are trying to download) is too large. These limits have been established by the Internet Service Provider who operates this cache. Please contact them directly if you feel this is an error.

Your cache administrator is webmaster.


Generated Fri, 18 Jun 2010 08:15:06 GMT by xxx.com (squid/2.7.STABLE7)

 

上面這個訊息是Squid 吐的,因此原因就出現在 Squid,

所以只要在 squid.conf 裡面加上

reply_header_max_size 10 MB

然後重新動啟 squid。

就搞定了。

相關設定小整理:
request_body_max_size
request_header_max_size
reply_body_max_size
reply_header_max_size

 

 

 

 

 

2010-06-08

【手機】iPhone : App Store、mail 進不去,會自已跳出來…

0 comments

前天幫 Patty 把 iphone 小小整理一下,然後該update 的就update 一下,

因為被她用的太亂了,東西都亂放。

結果今天跟我說不能進 App Store ,也不能進 Mail 收信。

弄了老半天,我也沒啥 idea。

後來查到有人說是 3G Unrestrictor 2.0 的問題,

在此:使用3G Unrestrictor 2.0後進app store跳出

移掉後,就真的進的去了~太棒了!!

在這裡記錄一下。

 

 

 

 

2010-06-04

【軟體】Wine : 使用 Photocap 來製作 LOMO 風照片

0 comments

PhotoCap 是一個國人寫的軟體,功能非常多,而且簡單好用

但現在我都是用Ubuntu,所以還是要想辦法,看能不能在 Ubuntu上執行。

首先安裝 wine,然後再把 PhotoCap 的安裝檔下載下來。

因為我覺的中文可能又會有亂碼的問題,所以我就直接抓英文版。

接著在 Terminal 中執行

$ wine PhotoCap501_EN.exe

很簡單就安裝好了,而且也可以順利執行。

下圖是我用 PhotoCap 把照片加上 LOMO 風,成果就是最上面的那張照片。



我只能說:台灣人真強!!

 

 

 

 

【軟體】Ubuntu : Double Commander

0 comments

Double Commander 這軟體還蠻不錯的,可以很方便的複制二個不同路徑下的檔案。

網站:http://doublecmd.sourceforge.net/

Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.

Here are some key features of Double Commander:

  • Unicode support
  • All operations working in background
  • Multi-rename tool
  • Tabbed interface
  • Custom columns
  • Internal text editor (F4) with syntax hightlighting
  • Built in file viewer (F3) to view files of in hex, binary or text format
  • Archives are handled like subdirectories. You can easily copy files to and from archives. Supported archive types: ZIP, TAR GZ, TGZ, LZMA and also BZ2, RPM, CPIO, DEB, RAR.
  • Extended search function with full text search in any files
  • Configurable button bar to start external programs or internal menu commands
  • Total Commander WCX, WDX and WLX plug-ins support
  • File operations logging
  • And more...

下載:http://sourceforge.net/projects/doublecmd/files/

我是下載 doublecmd_0.3.5.1-1.gtk2_i386.deb

安裝:執行
$ sudo dpkg -i doublecmd_0.4.5.1-1.gtk2_i386.deb
安裝完後,會出現在 Applications > Accessories > Double Commander,如下圖

執行畫面如下:

另外還有一套叫 GNOME Commander (如下圖),不過畫面看起來比較陽春,我就沒有去試了。