radiko.jpを録音する

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)サイマルラジオ」の配信サービスです。

radiko.jp

準備

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の取得

認証に必要なAuthTokenKeyLengthKeyOffsetを取得します。 やっていることは、https://radiko.jp/v2/api/auth1_fmsに空のデータをPOSTしているんですけど、この時にヘッダーを4つ指定しています。 X-Radiko-AppX-Radiko-App-VersionX-Radiko-DeviceX-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-KeyLengthX-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-AuthTokenX-Radiko-Partialkeyをもとに認証をします。 やっていることは、https://radiko.jp/v2/api/auth2_fmsに空のデータをPOSTしているんですけど、この時にヘッダーを6つ指定しています。 X-Radiko-AppX-Radiko-App-VersionX-Radiko-DeviceX-Radiko-Userauth1_fmsにPOSTした時と同じです。 X-Radiko-Authtokenauth1_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で再生できるようになるまでを書いてみました。