radiko.jpの番組表を端末に表示する

radiko.jp(ラジコ) | ラジオがインターネット(アプリやパソコン)で無料で聴けるが始まったが、プレスリリースの通り、Flash Playerによる再生、IPアドレスによる地域判別による利用制限など、お固い仕様となっている。

録音に関しては、スピーカ出力を入力に持ってくるループバックなどが使えるので大抵のPCでは問題は無い。玄箱/Linuxでしようと思うと、結構難しいかもしれない。

radikoでは配信しているラジオ局の1週間分の番組データを配信/表示している。これは、URLさえ知っていれば、利用可能区域外でも参照可能のようだ(東京から大阪の番組表を参照出来たから)。

簡単に、Pythonで番組データを解析、時間とタイトルを表示するスクリプトを書いた。UNIX哲学 - Wikipediaに含まれる「標準入出力を扱うプログラムを書け。標準入出力は普遍的インターフェースなのだ。」に倣い。

$ python radiko.py today  # 今日の番組一覧
$ python radiko.py tomorrow  # 明日の番組一覧
$ python radiko.py  # 1週間分の番組一覧
#!/usr/bin/python

#   Copyright (C) SAEKI Yoshiyasu

# TODO: 放送局絞り込み、柔軟な日時指定

import lxml.etree
import sys
import datetime

BANGUMI_URL = "http://radiko.jp/epg/epgapi.php?area_id=JP13"
# area_id: JP13(Tokyo) or JP27(Osaka)
# mode: now or nothing
# station_id: ID or nothing

root = lxml.etree.parse(BANGUMI_URL)

if len(sys.argv) >= 2:
    opt = sys.argv[1]
    if opt == "today":
        today = datetime.datetime.now().strftime("%Y%m%d")
        progl = root.xpath('.//progs[@date="%s"]' % today)
    elif opt == "tomorrow":
        tomorrow = (datetime.datetime.now() + datetime.timedelta(days=+1)).strftime("%Y%m%d")
        progl = root.xpath('.//progs[@date="%s"]' % tomorrow)
    else:
        progl = root.xpath(".//progs")
else:
    progl = root.xpath(".//progs")

for progs in progl:
    name = progs.getparent().xpath("./name")[0].text
    date = progs.get("date")  # YYYYMMDD
    print "/".join([date[0:4], date[4:6], date[6:8]]), "\t", unicode(name).encode("utf-8")
    for prog in progs.xpath(".//prog"):
        title = prog.xpath(".//title")[0].text
        stime = prog.get("ftl")  # HHMM
        etime = prog.get("tol")  # HHMM
        print "\t" + stime[0:2] + ":" + stime[2:4] +\
            " ~ " + etime[0:2] + ":" + etime[2:4] +\
            "\t" + unicode(title).encode("utf-8")

番組データから得られるデータとして、タイトルの他にMC情報、リクエスト先メールアドレスなどがある。