[4]フィードの取得
Youtubeサービスにクエリを送信し、それに応じた結果をフィードをZend_Gdata_YouTube_VideoFeedオブジェクトとして取得します。
$feed = $youtube->getVideoFeed($query);
このフィードはRSSやAtomといったXMLベースのものと冒頭で述べましたが、実際どのようなデータが格納されているのでしょうか。下記は多く省略していますが、取得したフィードのXMLの内容です。実際にはもっと多くの情報が含まれています。
<feed>
<entry>
<id>動画のID含むURL</id>
<title>動画タイトル</title>
<author>
<name>投稿者名</name>
<url>投稿者URL</url>
</author>
<media:group>
<media:thumbnail url="サムネイルのURL" height="高さ" width="幅" time="時刻" />
</media:group>
</entry>
</feed>
今回の例では次のフィードを取得することになります。
http://gdata.youtube.com/feeds/api/videos?vq=%E3%83%89%E3%82%A2%E3%83%A9&orderby=viewCount&max-results=10
フィードを要求するURLにはvqやorderbyといったクエリパラメータがありますが、これらが先ほどZend_Gdata_YouTube_VideoQueryに設定していたパラメータとなります。Zend_Gdata_YouTube_VideoQueryオブジェクトはこのURLを作成していたことになります。
実際に上記をブラウザのアドレスバーに入力すると次のようなXMLが表示されます。これがZend_Gdataが取得する生のデータになります。
<?xml version="1.0" encoding="UTF-8" ?>
<link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos?start-index=1&max-results=10&vq=%E3%83%89%E3%82%A2%E3%83%A9&orderby=viewCount" />
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gml="http://www.opengis.net/gml" xmlns:georss="http://www.georss.org/georss" xmlns:media="http://search.yahoo.com/mrss/" xmlns:batch="http://schemas.google.com/gdata/batch" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:gd="http://schemas.google.com/g/2005">
<entry>
<id>http://gdata.youtube.com/feeds/api/videos/0sb64YgNqew</id>
<title type="text">ドアラ 2007/05/26 グッドウィルドーム vol.1 試合前</title>
<author>
<name>xxxxx</name>
<uri>http://gdata.youtube.com/feeds/api/users/xxxxx</uri>
</author>
<media:group>
<media:title type="plain">ドアラ 2007/05/26 グッドウィルドーム vol.1 試合前</media:title>
<media:thumbnail url="http://i.ytimg.com/vi/0sb64YgNqew/2.jpg" height="97" width="130" time="00:04:45" />
</media:group>
</entry>
</feed>
[5]取得数表示
取得したフィードから必要な情報を取り出して、ブラウザに表示します。
まずは検索結果が何件あったかの表示です。
echo '【 '.$keyword.' 】の検索結果【 '.$feed->getTotalResults().' 】件<br />';
Zend_Gdata_YouTube_VideoFeedクラスにはgetTotalResults関数があり、これによりフィード内に何件のエントリーがあったかを取得することができます。これはZend_Gdata_YouTube_VideoFeedクラスの継承元のZend_Gdata_Media_Feedクラスのさらに継承元のZend_Gdata_Feedクラスの関数で、Youtube APIにかかわらずフィードクラスには共通で使用できます。
[6]取得結果表示のための情報取得
次に取得した結果のリストを表示します。
取得したフィード内で1件のデータはentryという形で格納されています。先ほどのXMLファイルでも確認してみましょう。このentryはZend_GdataではZend_Gdata_YouTube_VideoEntryオブジェクトとして扱います。
foreach ($feed as $entry) {
$contentUrl = $entry->mediaGroup->content[0]->url;
$thumbnailUrl = $entry->mediaGroup->thumbnail[0]->url;
$videoTitle = $entry->mediaGroup->title;
(略)
}
Zend_Gdata_YouTube_VideoEntryオブジェクトから動画のURLと、サムネイルのURL、動画のタイトルを取得します。
その他にもVideoEntryオブジェクトには動画の情報が多く含まれています。取得したXMLファイルを見ると<media:group>という要素がありますが、それらの要素がZend_Gdata_YouTube_MediaGroupオブジェクトにマッピングされており、$entry->mediaGroup(もしくは$entry->getMediaGroup())で取得することができます。
また頻繁に使用される情報などはわざわざZend_Gdata_YouTube_MediaGroupオブジェクト経由で取得をしなくても、VideoEntryオブジェクトから直接呼び出せるようになっているものもあります。
| 関数名 | 戻り値 | 内容 |
| getVideoTitle | string | 動画のタイトル取得 |
| getVideoDescription | string | 動画の説明 |
| getVideoCategory | string | 動画のカテゴリ |
| getVideoThumbnails | array | 動画のサムネイルの格納された配列 |
| getVideoWatchPageUrl | string | 動画のURL |
| getFlashPlayerUrl | string | 動画のフラッシュのURL |
| getComments | string | 動画のコメント |
| getVideoViewCount | string | 動画の再生回数 |
[7]取得結果表示
エントリーごとに取得した情報を表示します。HTMLの表示部分が多いため、ヒアドキュメント(print <<<END ~ END;)を使用しています。
foreach ($feed as $entry) {
(略)
print <<<END
<tr>
<td width="130"><img src="${thumbnailUrl}" /></td>
<td width="100%">
<a href="#"
onclick="window.open('${contentUrl}','${videoTitle}','width=500,height=300');">
${videoTitle}
</a>
</td>
</tr>
END;
}
2列のテーブルの左側にサムネイルを表示し、右側に動画のタイトルを表示します。また、タイトルには動画のURLにアクセスするようにリンクを付けます。クリックするとポップアップウィンドウが開くように、JavaScriptを使用しています。
まとめ
いかがでしょうか。Google Data APIとZend_Gdataの連係について理解できましたでしょうか。今回のYoutubeの例にかかわらず、サービス、クエリ、フィード、エントリという考え方は共通ですので、これを理解すれば他のGdataライブラリも簡単に扱えます。
次回は、GoogleカレンダーにアクセスするZend_Gdata_Calendarについて紹介します。今回は検索だけでしたが、次回は認証を使用して、プライベートなデータの取得を行います。
