getUserUploads() は使えない。Zend_Gdata_YouTube + Zend_Paginator を使って自分の動画リストを表示するサンプル

ZendFramework

ハマりポイントがあまりにも多かったので自分用にメモ
やりたかった事は単純で、自分の動画リストをページ送りで取得したかっただけ。

Zend_Gdata_YouTube

サンプルソースは確かに動くのだけど、
パラメータを追加したいとか、ちょっとした指定でとたんにサンプルソースは使えなくなる。

Zend_Gdata_YouTubeの出来がちょっと酷い。

getUserUploads()は引数$locationを与えれば、クエリーされると思いきやソースを見たら全然違った。

\Zend\Gdata\YouTube.php

public function getUserUploads($user = null, $location = null)
{
    if ($user !== null) {
        $uri = self::USER_URI . '/' . $user . '/' .
               self::UPLOADS_URI_SUFFIX;
    } else if ($location instanceof Zend_Gdata_Query) {
        $uri = $location->getQueryUrl();
    } else {
        $uri = $location;
    }
    return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed');
}

なんじゃこりゃー
$userを与えたら他は無視という仕様。
パラメータを付けるならリクエストURLから全部書けってどういうことさ。

他にもgetVideoEntry()getUserProfile()・・・いろいろ関数はあるが、パラメータをつけたいときは全て無駄。
結局はgetVideoFeed()と同じ動作になる。

ってことでgetUserUploads()を使わず、Zend_Paginatorも使って目的の動作をさせるためにこう書いた。

$url = sprintf(
   '%s/%s/%s',
    Zend_Gdata_YouTube::USER_URI,
    $username,
    Zend_Gdata_YouTube::UPLOADS_URI_SUFFIX
);

$query = new Zend_Gdata_Query($url);
$query->setMaxResults($limit)
  ->setStartIndex($this->_getParam('p', 1))
  ->setParam('orderby', 'published');

$yt = new Zend_Gdata_YouTube();
$videoFeed = $yt->getVideoFeed($query);


$adapter = new Zend_Paginator_Adapter_Null($videoFeed->totalResults->getText());
$paginator = new Zend_Paginator($adapter);
$paginator->setCurrentPageNumber($this->_getParam('p', 1))
  ->setItemCountPerPage($limit)
  ->setPageRange(5);

Zend_Paginator_Adapterの種類はNull
最初Zend_Paginator_Adapter_Arrayじゃないのかなと思ったけど、Array型は全配列が存在するときに使う。
・・・実際どんな場面に利用できるのかイメージできないけど。

YoutubeAPIが返すトータル件数を取得するときは$videoFeed->totalResultsで参照するのではなく->getText()をチェインする。

こんな基本動作が、公式サンプルには全く書かれてない・・。
たったこれだけでとても苦労した。

参考

ZEND FRAMEWORK – Zend Paginator with Gdata Youtube

デベロッパー ガイド: PHP

デベロッパー ガイド: Data API プロトコル – API クエリ パラメータ

WordPressで自分のYouTubeの動画をリスト表示する簡単なプラグインを作ってみる

コメント

タイトルとURLをコピーしました