先日、MacBookのOSをクリーンインストールした際、それまでradikoのタイムフリーの保存に使っていたradikoroの最新版がタイムフリーの保存機能を削除していたことに気づきました。
ループバック機能を使えば、再生しながら保存することは可能なのだがそれだと番組の放送時間と同じだけ時間がかかってしまいます。
他にいいソフトが無いか探してみたのですが、いまいちだったので結局自分でスクリプトを組ことにしました。
スクリプトを組むにあたって、radikoの保存手順を調べてみました。
環境
OS: Mac OS High Sierra
必要なソフト:swftools、ffmpeg (Homebrewより導入)
事前準備
myplayer-release.swfのダウンロード
認証のための事前準備としてswfファイルをダウンロードする
$ curl -O http://radiko.jp/apps/js/flash/myplayer-release.swf
swfファイルから画像ファイルを取り出す
認証にキーとなる画像ファイルをswfextractで取り出す
$ swfextract myplayer-release.swf -b 12 -o authkey.png $ ls authkey.png authkey.png
実行
認証1
認証1のURLにアクセスし、HTTPのレスポンスヘッダーから以下の3つの値を取得する
・X-Radiko-AuthToken
・X-Radiko-KeyLength
・X-Radiko-KeyOffset
$ curl 'https://radiko.jp/v2/api/auth1_fms' \ > -XPOST \ > -H 'Content-Type: application/x-www-form-urlencoded' \ > -H 'Referer: http://radiko.jp/' \ > -H 'Pragma: no-cache' \ > -H 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ > -H 'X-Radiko-Device: pc' \ > -H 'X-Radiko-App-Version: 4.0.0' \ > -H 'X-Radiko-User: test-stream' \ > -H 'X-Radiko-App: pc_ts' \ > --data $'\r\n' X-Radiko-AppType=pc X-Radiko-AppType2=pc X-Radiko-AuthToken=AJReLqXV-Oo4ymYpgRlhow X-Radiko-AuthWait=0 X-Radiko-Delay=15 X-Radiko-KeyLength=16 X-Radiko-KeyOffset=121394 please send a part of key
事前準備でダウンロードしたキーとなる画像ファイルから、X-Radiko-KeyOffsetがオフセット、X-Radiko-KeyLengthが長さとなるデータを抽出する。
UNIXのddコマンドを使って抽出する。なお、抽出したデータはBase64で文字列に変換する。
$ dd if=authkey.png ibs=1 skip=121394 count=16 | base64 16+0 records in 0+1 records out 16 bytes transferred in 0.000669 secs (23916 bytes/sec) kwMYHYGpTwcgn8OlMjBjyQ==
「kwMYHYGpTwcgn8OlMjBjyQ==」が認証2で使うParticalkeyとなる
認証2
認証2のURLに対して、AuthTokenとParticalkeyをPOSTする
curl 'https://radiko.jp/v2/api/auth2_fms' \ -XPOST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Referer: http://radiko.jp/' \ -H 'Pragma: no-cache' \ -H 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ -H 'X-Radiko-Device: pc' \ -H 'X-Radiko-Authtoken: AJReLqXV-Oo4ymYpgRlhow' \ -H 'X-Radiko-App-Version: 4.0.0' \ -H 'X-Radiko-User: test-stream' \ -H 'X-Radiko-Partialkey: kwMYHYGpTwcgn8OlMjBjyQ==' \ -H 'X-Radiko-App: pc_ts' JP13,東京都,tokyo Japan
応答として地域の情報が帰ってくると認証は成功。
音声の保存
プレイリスト取得用のURL(https://radiko.jp/v2/api/ts/playlist.m3u8)に対して、クエリとして放送局IDと開始、終了時間を指定してするとプレイリストを取得できます。
なお、lというクエリには15を指定するらしいのですが、意味は不明です。
放送局IDについてはググると出てくると思います。
これをffmpegの引数として渡すことで、音声の保存が可能。
ffmpeg \ > -content_type 'application/x-www-form-urlencoded' \ > -headers 'Referer: http://radiko.jp/' \ > -headers 'Pragma: no-cache' \ > -headers 'X-Radiko-AuthToken: AJReLqXV-Oo4ymYpgRlhow' \ -user_agent 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ > -i 'https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=LFR&l=15&ft=20180518010000&to=20180518030000' \ > -vn -acodec copy -bsf aac_adtstoasc out.m4a
iTunes等で聴けるように、ffmpegのオプションでm4a形式で保存するようにしています。
まとめ
以上の手順によってradikoのタイムフリーを短時間で保存することが出来ます。
なお、最初にログイン処理を挟めばエリアフリーも対応可能です。
エリアフリーの場合はこちら。
コメント