YouTubeの特定のタグが付いたビデオページを投稿時間順にRSSで取得したい。 YouTubeのサイトでもタグによるRSSフィードを以下のようなURLでも取得できるらしい(参考:[戯] YouTube でタグによる RSS フィードを取得するには)。
http://www.youtube.com/rss/tag/タグ.rss
でも、これあんまりいけてなくて投稿時間順にソートすることができないんだよね。 ということで「それPla(ry」精神、Plaggerでやってみる。Pluginを探すとmizzyさんが作ったCustomFeed::YouTubeというぴったりのPluginがあるじゃないですか。video_date_uploadedでソートもできる。これはいけるぞ!と思ってRSSを作ってみたが問題がひとつある。RSSで言うとdc:date、pubDateといった更新時間が取得できないのだ。個人的にRSSの魅力はこの更新時間が取得できて、ソートできる点だと感じているので、このままでは使えないなとう感触。そこで、mizzyさんのCustomFeed::YouTubeをハックして俺の希望通りのフィードを吐くようにしてみる。
方針は、ビデオ情報に関してはYouTube APIを利用して取得するというもの。 CustomFeed::YouTubeはYouTubeの検索結果HTMLを解析して全ての情報を取得している。 そこには投稿時間の情報が無いので取得できないという具合になっている。 なので、CustomFeed::YouTubeで取得できるビデオのIDを利用して、そのままそのIDを引数にYouTube APIの youtube.videos.get_detailsというメソッドを呼び出してビデオ情報を取得する。 以下がそのサブルーチン。
sub get_details{ my($dev_id,$video_id) = @_; my $youtube_url = "http://www.youtube.com/api2_rest?method=youtube.videos.get_details&dev_id=$dev_id&video_id=$video_id"; my $youtube_xml = get ($youtube_url) or die("can't get xml"); my $parser = XML::Simple->new(); my $xml_ref = $parser->XMLin("$youtube_xml"); return $xml_ref->{'video_details'}; }
ビデオ情報を取得したらそのままフィードのアイテムに追加。 ビデオの投稿時間upload_timeがUNIX時間で返ってくるので
Plagger::Date->from_epoch($video_details->{upload_time});
としてRSSの日付形式に変換してやる。
てなわけで、うまくハックできました→
ソース(YouTube_dev.txt)。Perl始めて間もないので何か変なとこあればアドバイスください。
我が研究室、奥出研のタグ「oklab」に関するRSSはこんな感じです→
http://www.kamawada.com/~yusuke/oklab/youtube/oklab.xml
ちょこちょこ利用しだしたPlagger、Pluginの書き方もわかってきたぞー。宮川さんとCustomFeed::YouTube作ったmizzyさんに感謝。