理系学生日記

おまえはいつまで学生気分なのか

Youtube Data API での動画検索方法

Youtube には、Youtube の機能をプログラムから(かなり)自由に使用できる Data API が用意されている。この Data API を使用することによって、評価の高い動画の取得や動画のアップロード、キーワード検索などが可能になる。

中でも動画の検索はかなり気楽に使用することができる。
API 用の URL (http://gdata.youtube.com/feeds/api/videos)に対して、予じめ定められたパラメータを HTTP GET で送信すれば良い。予め定められたパラメータとしては、動画のソート順を指定する orderby だったり、結果レコードの数の最大値を指定する max-results だったり、アップロードされた時期を指定する time だったりがあるが、単純に使用するだけなら vq パラメータだけを指定してやれば良い。

2010-07-04 のエントリは、これを単純に実行した例に過ぎない。
※マルチバイト文字列を指定するためには、URL エスケープが必要になる。

my $res = LWP::UserAgent->new->get('http://gdata.youtube.com/feeds/api/videos?vq=' . uri_escape( '猫鍋' ) );


この API を使用すると、Youtube からはレスポンスとして XML が返却される。
この XML は Atom をはじめとした複数の XML スキーマのタグが使用されている。ちなみに、XML のデフォルトの名前空間として指定されるのが Atom である。

返却される情報は、複数の動画エンティティをはじめ、各種情報へのリンクや URL などが含まれており、かなり大量である。
単純に動画の情報だけで良いなら、entry タグの部分を抽出してやれば良い。
注意が必要なのは、デフォルト名前空間を持つ要素を XPath でどう指定するかであって、これを XML::LibXML で実現するためには XML::LibXML::XPathContext::registerNs を使用し、prefix と名前空間のマッピングを定義する方法がある。

    my $dom = XML::LibXML->load_xml({
        string => $res->decoded_content
    });
    my $xpc = XML::LibXML::XPathContext->new($dom);
       $xpc->registerNs( atom => 'http://www.w3.org/2005/Atom' );

    my @entries = $xpc->findnodes( '/atom:feed/atom:entry' => $dom );

このようにして取得した entry 要素には、動画の URL やその動画の時間、アップロードされたユーザやその日時、評価などのデータが含まれる。あとは必要な情報を好きな方法(XPath など)で抜き出せば良いと思う。