日本語リージョンで取得可能な YouTube API のカテゴリフィード

YouTube API でカテゴリ毎のフィードを取得したい場合、URI 構成の例として次のようなものが有効です。

http://gdata.youtube.com/feeds/api/standardfeeds/JP/most_viewed_{カテゴリ名}?time=today

{カテゴリ名} には「映画とアニメ」であれば、Film が入ります。


YouTube API が指定しているカテゴリは、次のリファレンス記事の categories.cat(XML) ファイルに記述してあります。

リファレンス ガイド: Data API プロトコル - アップロードする動画のカテゴリ リスト

categories.cat から一部を抜粋したものが以下になります。

<atom:category term="Film" label="映画とアニメ" xml:lang="ja-JP">
    <yt:assignable/>
    <yt:browsable regions="AM AR AU BG BR CA CZ DE DK ES FI FR GB GR HK HR HU ID IE IL IN IT JP KR LT LV MX NL NO NZ PL PT RO RU SE SK SL SR TH TW US VI ZA"/>
</atom:category>

<atom:category term="Nonprofit" label="非営利団体と社会活動" xml:lang="ja-JP">
    <yt:assignable/>
    <yt:browsable regions="US"/>
</atom:category>

<atom:category term="Movies" label="映画" xml:lang="ja-JP">
    <yt:deprecated/>
</atom:category>

この中で、 タグがあるカテゴリは、カテゴリフィードが取得可能です。 取得の際の {カテゴリ名}term 属性の値になります。
しかし、フィード URI に .../JP/... (日本リージョン)を指定してある場合、regions 属性の中に JP が含まれていないと取得できません。
したがって、非営利団体と社会活動」のフィードは上記 URI 構成では取得できないということになります。

このような XML ファイルから、日本語リージョンで取得可能なカテゴリの termlabel を表示する Python スクリプトを以下に用意しました。

from BeautifulSoup import BeautifulStoneSoup

def print_term_and_label(category):
    for attr in category.attrs:
        if attr[0] == 'term':
            print attr[1]
        if attr[0] == 'label':
            print attr[1].encode('utf-8')

def is_containing_JP(category):
    browsable = category.find('yt:browsable')  # <yt:browsable>
    if not browsable:
        return False
    for attr in browsable.attrs:
        if attr[0] == 'regions':
            regions = attr[1]  # unicode
            if regions.find('JP') >= 0:
                return True
    return False

def main():
    file = open('categories.cat')
    try:
        content = file.read()
    finally:
        file.close()
    # BeautifulStoneSoup
    soup = BeautifulStoneSoup(content)
    categories = soup('atom:category')  # <atom:category>
    for category in categories:
        if is_containing_JP(category):
            print_term_and_label(category)

if __name__ == '__main__':
    main()

以下のような出力が得られるでしょう。

Film
映画とアニメ
Autos
自動車と乗り物
Music
音楽
Animals
ペットと動物
Sports
スポーツ
Travel
旅行とイベント
Games
ゲーム
Comedy
コメディー
People
ブログと人
News
ニュースと政治
Entertainment
エンターテイメント
Education
教育
Howto
ハウツーとスタイル
Tech
科学と技術

categories.cat はネットワークで取得してもいいかもしれません。