radiko.jpを録音することについて調べてみました。
環境
- OS X El Capitan バージョン 10.11.3
- Homebrew バージョン 0.9.5
- RTMPDump バージョン 2.4
- SWFTOOLS バージョン 0.9.2
radiko.jp?
radiko.jpは、パソコンがそのままラジオ受信機となる「IP(Internet Protocol)サイマルラジオ」の配信サービスです。
準備
Homebrewを先にインストールしておきます。
RTMPDumpを先にインストールしておきます。
SWFTOOLSをインストールします。
$ brew install swftools
==> Downloading https://homebrew.bintray.com/bottles/swftools-0.9.2_1.el_capitan
######################################################################## 100.0%
==> Pouring swftools-0.9.2_1.el_capitan.bottle.tar.gz
🍺 /usr/local/Cellar/swftools/0.9.2_1: 31 files, 6.7M
認証
SWFファイルのダウンロード
player_4.1.0.00.swfファイルをダウンロードします。
$ curl -o player_4.1.0.00.swf http://radiko.jp/player/swf/player_4.1.0.00.swf
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 955k 100 955k 0 0 2938k 0 --:--:-- --:--:-- --:--:-- 2986k
authkeyの抽出
ダウンロードしたplayer_4.1.0.00.swf
ファイルから認証に必要なファイルを取り出します。
SWFTOOLSの機能であるswfextractというコマンドを使います。
player_4.1.0.00.swf
というファイルの中には11のバイナリーファイル(画像とか)があって、その中から14
の番号がついているファイルを取り出すコマンドになっています。
ここではauthkey.png
という名前で取り出したファイルを保存しています。
$ swfextract player_4.1.0.00.swf -b 14 -o authkey.png
AuthTokenの取得
認証に必要なAuthToken
とKeyLength
、KeyOffset
を取得します。
やっていることは、https://radiko.jp/v2/api/auth1_fms
に空のデータをPOSTしているんですけど、この時にヘッダーを4つ指定しています。
X-Radiko-App
、X-Radiko-App-Version
、X-Radiko-Device
、X-Radiko-User
の4つですけど、これらはブラウザーからradiko.jpで聞く時にはこの内容でPOSTしているようです。
$ curl -d "" -H "X-Radiko-App: pc_1" -H "X-Radiko-App-Version: 2.0.1" -H "X-Radiko-Device: pc" -H "X-Radiko-User: test-stream" https://radiko.jp/v2/api/auth1_fms
X-Radiko-AppType=pc
X-Radiko-AuthToken=X3LzF2RCNEsjXKX76SnGFg
X-Radiko-AuthWait=0
X-Radiko-Delay=0
X-Radiko-KeyLength=16
X-Radiko-KeyOffset=196186
please send a part of key
キーの取り出し
取得したX-Radiko-KeyLength
、X-Radiko-KeyOffset
をもとに、authkey.png
から一部キーを取り出します。
取り出したものはバイナリーなので、Base64のエンコードをします。
一番下の行に出力されるのが結果です。
$ dd if=authkey.png ibs=1 skip=196186 count=16 | base64
16+0 records in
0+1 records out
16 bytes transferred in 0.000035 secs (456523 bytes/sec)
wDIeTo0gxlgpyf8AP5UAFw==
認証
ここまでで揃えたX-Radiko-AuthToken
、X-Radiko-Partialkey
をもとに認証をします。
やっていることは、https://radiko.jp/v2/api/auth2_fms
に空のデータをPOSTしているんですけど、この時にヘッダーを6つ指定しています。
X-Radiko-App
、X-Radiko-App-Version
、X-Radiko-Device
、X-Radiko-User
はauth1_fms
にPOSTした時と同じです。
X-Radiko-Authtoken
はauth1_fms
で取得したX-Radiko-AuthToken
です。
X-Radiko-Partialkey
は一つ前のコマンドで取得した文字列です。
認証が成功すると地域が取得できます。
$ curl -d "" -H "X-Radiko-App: pc_1" -H "X-Radiko-App-Version: 2.0.1" -H "X-Radiko-Device: pc" -H "X-Radiko-User: test-stream" -H "X-Radiko-Authtoken: X3LzF2RCNEsjXKX76SnGFg" -H "X-Radiko-Partialkey: wDIeTo0gxlgpyf8AP5UAFw==" https://radiko.jp/v2/api/auth2_fms
JP13,東京都,tokyo Japan
放送局のURL
地域が取得できたら、放送局のIDは次のURLから取得できます。JP13
のところが地域なので、一つ上のコマンドで取得した地域に変えてアクセスします。
http://radiko.jp/v2/station/list/JP13.xml
アクセスするとXMLなので分かりづらいですが、必要なのは<id>
に記載されている箇所で、TBSラジオの場合はTBS
ということになります。
<?xml version="1.0" encoding="UTF-8" ?>
<stations area_id="JP13" area_name="TOKYO JAPAN">
<station>
<id>TBS</id>
<name>TBSラジオ</name>
<ascii_name>TBS RADIO</ascii_name>
<!-- ...略... -->
放送局のIDがわかったら、次のURLにアクセスして放送局のURLを取得します。TBS
のところはそれぞれの放送局のIDに変えます。
http://radiko.jp/v2/station/stream/TBS.xml
アクセスすると放送局のURLがわかります。<item>
が2つありますが、どちらも同じようなので、上の方を使うことにします。
<?xml version="1.0" encoding="UTF-8" ?>
<url>
<item>rtmpe://f-radiko.smartstream.ne.jp/TBS/_definst_/simul-stream.stream</item>
<item>rtmpe://f-radiko.smartstream.ne.jp/TBS/_definst_/simul-stream.stream</item>
</url>
放送局のURLは一度自分の地域の放送局を調べたらあまり変わることはないと思いますので、次回からは同じURLを使うことで大丈夫かなと思っています。
録音
$ rtmpdump -r rtmpe://f-radiko.smartstream.ne.jp/TBS/_definst_/simul-stream.stream -a TBS/_definst_ -W http://radiko.jp/player/swf/player_4.1.0.00.swf -C S:"" -C S:"" -C S:"" -C S:"X3LzF2RCNEsjXKX76SnGFg" -v -o filename.flv -B 60
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
Connecting ...
WARNING: Trying different position for server digest!
INFO: Connected...
Starting Live Stream
For duration: 60.000 sec
INFO: Metadata:
365.770 kB / 60.03 sec
Download complete
-r
と-a
のところにあるTBS
は放送局のIDに変えます。
-C S:"X3LzF2RCNEsjXKX76SnGFg"
のところはauth1_fms
で取得したX-Radiko-AuthToken
に変えます。
-o filename.flv
のところは任意のファイル名で保存するように名前を変えます。
-B 60
のところは60秒だけ保存するようになっていますので、任意の時間保存するように変えます。
終わり
radiko.jpは認証が必要ですけど、らじる★らじると同じように保存することができました。
参考
9 February 2016 追記
FLVファイルからAACファイルを抽出することについて書いてみました。
10 February 2016 追記
iTunesで再生できるようになるまでを書いてみました。