2010年6月4日金曜日

YouTube Data APIで最新の再生回数を取得するには?

先日、YouTube Data APIで取得できる最新の再生回数はユーザーページの「動画」のものらしく、そのビデオの情報リストから必要なビデオの情報を抽出すれば、最新の再生回数を取得できることを書いた。
琴線探査: YouTube Data APIで取得できる最新の「再生回数」はユーザーページの「動画」にある!

この時の問題は、動画の検索結果が一度のクエリの最大数である50個を超えた場合に、何度もクエリを投げなければならないことだった。

しかし、YouTube Data APIのExperimental機能「Retrieving a partial response」を使えば1度で取得できることがわかった!SQLのような感じで、検索結果の絞り込みができるのだ。
Developer's Guide: Data API Protocol - YouTube APIs and Tools - Google Code


追記10.06.24:やはり一度では取得できないことがわかった・・・
琴線探査: YouTube Data APIで絞り込み検索をしても一発で必要な情報を取れるわけではなかった・・・

追記10.06.24:これで一度で取得できることがわかった
琴線探査: YouTube Data APIで最新の再生回数を取得するには? PART2 たぶんこれで決定打


例えば、あるユーザーの特定のビデオのIDとtitleとviewCountはこのように取得できる。

/**
 * ユーザーがアップロードした全てのビデオ(YouTubeページではユーザーページの「動画」)
 * 情報リストから指定したビデオのID、title、最新のviewCountを取得する
 * @param videoAuthor ビデオの作者名
 * @param videoId ビデオのID(URL)
 * 
 */
private function searchUploads(videoAuthor:String, videoId:String):void {

  trace("uploadsSearch() " + videoAuthor + "がアップロードした全ビデオから検索します");

  var loaderUploads:URLLoader = new URLLoader();
  loaderUploads.addEventListener(Event.COMPLETE, onCompleteLoaderUploads);
  function onCompleteLoaderUploads():void {

    //検索結果のXML取得
    var xml:XML = XML(loaderUploads.data);
    trace("onCompleteLoaderUploads()\n" + xml);

    //ネームスペースをatomに
    default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
  
    //結果行取得(ID指定なので常に1行のみ)
    var entry:XMLList = xml.entry;
    if (entry.length() > 0) {

      //ネームスペースをytに
      default xml namespace = new Namespace("http://gdata.youtube.com/schemas/2007");
  
      //最新のviewCount取得
      var viewCount:uint = entry[0].statistics.@viewCount;
      trace("onCompleteLoaderUploads() 同一IDのentry発見! viewCount=" + viewCount);
   
    } else {
      trace("onCompleteLoaderUploads() 同一IDのentryがありませんでした");
    }
 
  }

  //検索結果を絞り込んで取得(このAPIはExperimentalなので注意)
  //http://code.google.com/intl/ja-JP/apis/youtube/2.0/developers_guide_protocol.html#Partial
  loaderUploads.load(new URLRequest("http://gdata.youtube.com/feeds/api/users/"
    + videoAuthor
    + "/uploads?fields="
    + "entry[id='" + videoId + "']"
    + "(title,id,yt:statistics)"
  ));

}

ポイントはこのクエリの構文。
http://gdata.youtube.com/feeds/api/users/videoAuthor/uploads?fields=entry[id='videoId'](title,id,yt:statistics)

「?fields」で絞り込みを行うことを指定。
「entry」でentryタグを指定。
「[id='videoId']」でidがvideoIdにマッチするentryに絞り込み。
「(title,id,yt:statistics)]でentryの子のtitleタグ、idタグ、yt:statisticsタグのみ含むように指定。

すばらしい。早くExperimentalを脱していただきたいものだ。