<?php
// 0からはじめるはじめてのYouTube API
// 素人プログラマりょーちが説明するので間違いとかありそうですが・・・
//
// ってことでとりあえず説明のよーなものを記載いたします。
// YouTube APIの基本的な流れはREST APIに何らかのパラメータを与えて
// 結果をXMLで受け取り、受け取ったXMLを加工して表示してあげるという
// 流れになります。
// また、APIに日本語のパラメータを渡す場合には、UTF-8 で URL Encode
// したものを渡します。手っ取り早いのはPHPのファイルをUTF-8で記載して
// そのままGETメソッドで渡す方法です
// また、取得したXMLの加工にはいろいろな方法があると思いますが、
// 私の場合はsimpleXMLを利用しています。

// YouTube のサイトの アカウントを持っている場合、
// http://www.youtube.com/my_profile_dev
// にアクセスすると Developer ID が表示されていると思います。
// APIの利用にはこの Developer ID が必要です。
// APIを呼び出すときのDEVIDは個人で異なりますのでご注意ください。
// (xxxxxxxxxの部分はご自分の Developer ID に書き換えてください)
define("DEVID","xxxxxxxxx");

// 関数定義
// getlbtは$tagで示されたタグの検索結果をXMLで返すための関数です
// といっても実際にやっていることはAPIに渡すためのURLを
// 生成することがメインです。
function getlbt($tag){
// http://www.youtube.com/dev_api_ref?m=youtube.videos.list_by_tag
// で youtube.videos.list_by_tag のパラメータを見てみると、
// GETメソッドで渡すパラメータは
// method / dev_id / tag / (page) / (per_page)
// の5つになっています。
// method : youtube.videos.list_by_tag
// dev_id : 上の行のdefineで定義したDEVID になります。
// tag    : 探したいタグ(UTF-8でURLエンコードされたもの)
// page   : 受け取ったデータの件数が数ページになる場合、その何ページ目を表示するか
// per_page : ページングを何ページ毎で区切るか(デフォルトは20で最大100)
// で、これらを念頭に入れ、REST APIの呼び出し用のURLを作ります。
// $tagは探したいタグ(UTF-8でURLエンコードされたもの)が入ります。
    
$url "http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag&dev_id=".DEVID."&tag=".$tag."&page=1&per_page=5";
// 上記で作成したURLから実際にXMLファイルを取得します。
// ここではSimpleXMLを利用しています。
// 下記を実行すると、$xmldataには「$url = 」で指定した検索結果が連想配列として
// $xmldataに入ります。
    
$xmldata simplexml_load_file($url);
// $xmldataをそのままreturnします。
    
return($xmldata);
// getlbt関数はここまでです。
}

// debugprintは本来不要なのですが説明のために記載します。
// $strに入っている連想配列を分かりやすく画面に表示させるものです。
// 1x1の幅100%のテーブルのカラムにPREタグでprint_r()するものです。
// print_rは配列を分かりやすく表示する関数です。
function debugprint($str){
    echo 
'<table width="100%"><tr><td><pre>';
    echo 
print_r($str);
    echo 
'</pre></td></tr></table>';
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>YouTube list by tagの簡単な説明</title>
</head>
<body>
<a href="./listbytag.phps" target="_blank">説明用</a><br />
<form method="get" action="./listbytag.php">
タグ:<input type="text" name="tag" />
<input type="submit" value="検索">
</form>

<?php
// ここからメイン関数
// 今回は分かりやすくするためにjavascriptではなく
// ブラウザで直接表示する方法で説明します。
// 上記で作成したgetlbt関数に取得したタグを渡します。

// GETメソッドでtagという名前の変数がNULLでなかったら

if ($_GET["tag"]<>""){

// フォームのinputタグで入力したtagの内容をgetlbtに渡します。
// $dataには上記で説明したようにXMLデータが連想配列として戻ってきます

    
$data getlbt($_GET["tag"]);

// debugprint関数に$dataを渡します。不用の場合はコメントアウトしてください。
    
debugprint($data);

// $dataに入っている連想配列のうち、$data->video_list->videoの部分だけ
// 取得し、$itemという変数として扱い、取得した数だけ繰り返します。

    
foreach($data->video_list->video as $item){

// YouTube TAGの場合は javascript で結果を表示させたいので、
// document.write構文を生成するようにしています。
// それが下記の行です。
//    echo 'document.write(\'<a href=\\\''.$item->url.'\\\' target=\\\'_blank\\\'><img src=\\\''.$item->thumbnail_url.'\\\' border=\\\'0\\\'/></a><br />\');';

// 今回はjavascriptのdocument.writeでは検証が困難だと思われますので
// あえて直接ブラウザに表示するようにしています。
// ここで、再度下記URLをご確認ください。
// http://www.youtube.com/dev_api_ref?m=youtube.videos.list_by_tag
// 動画用のURLは<video></video>内の<url></url>の中のデータである。
// これを取得するには、$item->urlとなるのでにリンクを張るときは
// 下記のように記載します

        
echo '<a href="'.$item->url.'">';

// 同様に動画用のサムネールのURLは<video></video>内の
// <thumbnail_url></thumbnail_url>の中のデータである。
// これを取得するには、$item->thumbnail_urlとなるのでに画像を張るときは
// 下記のように記載する

        
echo '<img src="'.$item->thumbnail_url.'">';

// Aタグの終了タグと強制改行の<br />を入れてみる。

        
echo '</a><br />';
    }
}

//メイン関数終わり・・・orz

//今回は youtube.videos.list_by_tag のみの説明でしたが、
// 他も基本的には同じです。
?>
</body>
</html>