youtubeAPIをphpで利用して最新の動画を取得 | 「PCエンジン」と「たま(柳原陽一郎)ライブレポート」+LifetouchNOTE使用日記ブログ

「PCエンジン」と「たま(柳原陽一郎)ライブレポート」+LifetouchNOTE使用日記ブログ

PCエンジンサイト「PCエンジン道場」に関するブログです。
バンド「たま」とそのメンバー(柳原陽一郎、石川浩司、知久寿焼、滝本晃司)に関するライブレポート
スマートブック「LIfetouchNOTE」に関する使用日記です。

ふと思い立ってPHPとかjavascriptの復習を今日は一日やってました。

webapiを利用するマッシュアップがとても楽しそうだったので

youtubeAPIをphpで利用して最新の動画を取得にチャレンジしてみました。
アウトプットとしてできたのがやなちゃん関連動画をひっぱってくるAPI。

http://www.pcefan.com/test/youtube2.php

結果として、自前ではxmlを取得する所までできたけど
xmlを変数に格納して、抽出する所でギブアップ!!!

結局ネットに転がっていたphpを参考(ほとんど流用して)にして
作成しました。
http://blog.iroiro-web.com/webapi/2008/11/05/youtube-%E5%8B%95%E7%94%BB%E6%A4%9C%E7%B4%A2-api-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/

もう、youtubeのxmlの仕様がやたらと面倒くさいです。
他のASPのように
$xml->title->data
のように簡単に取得できるように構造化もされていなかったので
抽出を解決するのに3時間かかりました。

結論として
上記のサイトのPHPを利用させてもらって、後は自分サイト用にカスタマイズすれば
必要な情報は取り出せそうです。

また、webapi的にはyoutubeは、難易度が高かったようです(笑)
次はシンプルなリクルート系の情報とかリンクシェアとかでチャレンジしようと思います。



require_once("apiconfig.php");
require_once("apifunc.php");

$request_url = 'http://gdata.youtube.com/feeds/api/videos';

$keyword = "柳原陽一郎";
$keyword4url = urlencode($keyword);
$q = '?vq='.$keyword4url.'&orderby;=published';

$xml_result = file_get_contents($request_url.$q);
$xml_result = str_replace('openSearch:', 'openSearch', $xml_result);
$xml_result = str_replace('media:', 'media', $xml_result);
$xml_result = str_replace('yt:', 'yt', $xml_result);
$xml_result = str_replace('gd:', 'gd', $xml_result);
$xml = simplexml_load_string($xml_result);

$res['totalResults'] = $xml-openSearchtotalResults;
$res['startIndex'] = $xml->openSearchstartIndex;
$res['itemsPerPage'] = $xml->openSearchitemsPerPage;

$first = $res['startIndex'];
$last = $first + $res['itemsPerPage'] - 1;
$itemnumber = $res['itemsPerPage'];

if($last > $res['totalResults']) {
$last = $res['totalResults'];
$itemnumber = $last - $first + 1;
}

for($i=0; $i<$itemnumber; $i++) {
foreach($xml->entry[$i] as $key=>$value) {
switch($key) {
case 'id':
$item[$i]['id'] = $value;
break;
case 'published':
$item[$i]['published'] = $value;
break;
case 'updated':
$item[$i]['updated'] = $value;
break;
case 'title':
$item[$i]['title'] = $value;
break;
case 'content':
$value = htmlspecialchars($value);
$item[$i]['content'] = $value;
break;
case 'author':
$item[$i]['authorname'] = $value->name;
$item[$i]['authoruri'] = $value->uri;
break;
case 'mediagroup':
$item[$i]['keywords'] = $value->mediakeywords;
$item[$i]['thumbnail'] = $value->mediathumbnail->attributes()->url;
$item[$i]['player'] = $value->mediaplayer->attributes()->url;
$item[$i]['duration'] = $value->ytduration->attributes()->seconds;
break;
case 'ytstatistics':
$item[$i]['viewCount'] = $value->attributes()->viewCount;
$item[$i]['favoriteCount'] = $value->attributes()->favoriteCount;
break;
case 'gdrating':
$item[$i]['ratingmin'] = $value->attributes()->min;
$item[$i]['ratingmax'] = $value->attributes()->max;
$item[$i]['ratingnumRaters'] = $value->attributes()->numRaters;
$item[$i]['ratingaverage'] = $value->attributes()->average;
break;
default:
// if(stristr($key,'url')) echo "$key: $value
\n";
// else echo "$key: $value
";
break;
}
}
}


echo "

{$res['totalResults']}件マッチしました。$first ~ $last 件目

\n";

echo "
    ";

    for($i=0; $i<$itemnumber; $i++) {
    echo "
  1. \n";
    echo "{$item[$i]['title']}
    \n";
    echo "
    \n";

    echo "〔キーワード〕 {$item[$i]['keywords']}
    \n";
    echo "〔投稿者〕 {$item[$i]['authorname']}さん
    \n";
    echo "〔再生時間〕 {$item[$i]['duration']}秒 \n";
    echo "〔閲覧回数〕 {$item[$i]['viewCount']}回 \n";
    echo "〔お気に入り〕 {$item[$i]['favoriteCount']}件
    \n";
    echo "〔評価〕 {$item[$i]['ratingaverage']} \n";
    echo "(評価人数: {$item[$i]['ratingnumRaters']}人)
    \n";
    echo "〔発行日時〕 {$item[$i]['published']} \n";
    echo "〔更新日時〕 {$item[$i]['updated']}\n";
    echo "
    \n";
    echo "
    {$item[$i]['content']}
    \n";

    echo "

    \n";
    }

    echo "
\n";
echo "
\n";

?>