SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend FrameworkでGoogleアプリケーションを使い倒す

Zend_GDataでYoutube動画検索アプリケーションを作成しよう

Zend FrameworkでGoogleアプリケーションを使い倒す(1)


[4]フィードの取得

 Youtubeサービスにクエリを送信し、それに応じた結果をフィードをZend_Gdata_YouTube_VideoFeedオブジェクトとして取得します。

[リスト9]searchVideo関数の一部
$feed = $youtube->getVideoFeed($query);

 このフィードはRSSやAtomといったXMLベースのものと冒頭で述べましたが、実際どのようなデータが格納されているのでしょうか。下記は多く省略していますが、取得したフィードのXMLの内容です。実際にはもっと多くの情報が含まれています。

[リスト10]フィード内容
<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>

 今回の例では次のフィードを取得することになります。

[リスト11]フィードを要求するURL
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が取得する生のデータになります。

[リスト12]実際のフィード(抜粋)
<?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]取得数表示

 取得したフィードから必要な情報を取り出して、ブラウザに表示します。

 まずは検索結果が何件あったかの表示です。

[リスト13]searchVideo関数の一部
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オブジェクトとして扱います。

[リスト14]searchVideo関数の一部
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オブジェクトから直接呼び出せるようになっているものもあります。

VideoEntryから動画の情報を取得するおもな関数
関数名 戻り値 内容
getVideoTitle string 動画のタイトル取得
getVideoDescription string 動画の説明
getVideoCategory string 動画のカテゴリ
getVideoThumbnails array 動画のサムネイルの格納された配列
getVideoWatchPageUrl string 動画のURL
getFlashPlayerUrl string 動画のフラッシュのURL
getComments string 動画のコメント
getVideoViewCount string 動画の再生回数

[7]取得結果表示

 エントリーごとに取得した情報を表示します。HTMLの表示部分が多いため、ヒアドキュメント(print <<<END ~ END;)を使用しています。

[リスト15]searchVideo関数の一部
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について紹介します。今回は検索だけでしたが、次回は認証を使用して、プライベートなデータの取得を行います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Zend FrameworkでGoogleアプリケーションを使い倒す連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 森山 絵美(モリヤマ エミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3695 2009/04/20 11:23

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー