2010年2月26日金曜日

YouTubeのMP4アドレスを取得するPHP

ビューワー2の正式版がリリースされたらユーチューブ対応テレビは不要になるかもですけど、YouTubeMP4みたいにYouTubeのアドレスをMP4ファイルのダウンロード用アドレスに変換してリダイレクトするPHPスクリプトを公開します。YouTubeMP4が重くて利用できない(負荷が高い時間帯に使えない)ことがよくあるので、この前販売中止したYouTube TV screenのサポート用として書いたものの公開なんですが、他の用途で使って頂いてもオッケーです^^

PHP対応してるHTTPサーバーをお持ちの方に限られますが、このスクリプトを自分のサーバーに設置してyoutubemp4.comの代わりにTVの変換サーバーに設定してください。そうすればYouTube自体が重いとき以外はいつも視聴可能になると思います^^

<?php
// YouTube MP4 address converter

$v=$_GET['v'];
if (!$v) {  // ビデオIDチェック
  echo "Video id not found.\n\n";
  echo "Usage, \n";
  echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?v=VideoID\n";
  exit;
}

function get_location($url)
{  // MP4アドレスを取得
  $addr=parse_url($url);
  $port=isset($addr['port'])? $addr['port']:80;
  $fp=fsockopen($addr['host'],$port,$errno,$errstr,30);
  if (!$fp) echo "$errstr ($errno)\n";
  else {
    $data="HEAD ".@$addr['path']."?".@$addr['query']." HTTP/1.1\r\n";
    $data.="Host: ".$addr['host']."\r\n";
    $data.="Connection: Close\r\n\r\n";
    fwrite($fp,$data);
    while (!feof($fp)) $header.=fgets($fp,128);
    fclose($fp);
    preg_match("/\s+Location: +(.*)\s/",$header,$m);
    return $m[1];
  }
}

// YouTube動画ページ取得
$youtube="http://www.youtube.com/watch?v=".$v;
$str=implode("",file($youtube));
if (!$str) {
  echo "Can't open ".$youtube.".\n";
  exit;
}

// tの値取得
if (preg_match("/['\"]SWF_ARGS['\"]\s*:\s*\{(([^\}]|\s)*)\}/",$str,$m)) {
  $str=$m[1];
  if (preg_match("/\"t\"\s*\:\s*\"([^\"]*)\"/",$str,$m)) $t=$m[1];
}

// リダイレクト先取得用アドレス
if (isset($t)) $str="http://www.youtube.com/get_video?fmt=18&video_id=".$v."&t=".$t;
else $str="";

if ($str) {
  $str=get_location($str);  // リダイレクト先チェック
  if ($str) {
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
    header("Location:".$str,true,302);  // MP4アドレスにリダイレクト
  }
  else echo "Can't get moved location.\n";
}
else echo "Can't get data from ".$youtube.".\n";
?>

スクリプト名をwatch.phpにしたら http://○○○.××/△△△/watch.php?v=Wv20U7rJuwU って感じで呼び出すようにしてくださいね。(Wv20U7rJuwUの部分がビデオIDになります)

2月28日追記: このPHPを呼び出すテレビやプレーヤーなどを自作される場合、LSLはYouTube-mp4アドレス変換スクリプトとかが参考になると思います。

3月22日追記: コメントにありますように、YouTubeの仕様が変わったようなので現在このスクリプトは使えません;;

4 件のコメント:

  1. 感謝です~。借りていたホスティングで動きました^^

    返信削除
  2. あっ、どうも。。。^^
    早速動作報告もらえて嬉しいです。ご利用ありがとうございます♪

    返信削除
  3. またまた仕様変更したみたいですね、YouTube。。。
    いたちごっごですよね。

    返信削除
  4. うわっ、やっぱり仕様変更ですかね?
    最近また見れなくなってたので、おかしいなって思ってたんですよ。。。ホント半年くらいで仕様が変わっちゃうんですね;;

    返信削除