ラジコタイムフリーの番組を保存するシェルスクリプトです。
必要な外部ツールは最小限に、またash,dashでも動作するよう努めています。
- curl
- libxml2 (xmllintのみ使用)
- FFmpeg (3.x以降 要AAC,HLSサポート)
$ ./rec_radiko_ts.sh [options]
| 引数 | 必須 | 説明 | 備考 |
|---|---|---|---|
| -s STATION | ○ | 放送局ID | -l で表示されるID |
| -f DATETIME | ○ | 開始日時 | JSTでの日時 (dateコマンドでの書式)
|
| -t DATETIME | △*1 | 終了日時 | 書式は -f と同じ *2 |
| -d MINUTE | △*1 | 録音時間(分) | -f で指定した時間に加算することで終了日時を計算する *2 |
| -u URL | 番組URL | ラジコサイトの番組表から番組詳細ページへ移動したあとのURL、またはシェアラジコURLから -s -f -t の値を自動で取得する |
|
| -m MAIL | ラジコプレミアム メールアドレス | 環境変数 RADIKO_MAIL があれば自動指定されます |
|
| -p PASSWORD | ラジコプレミアム パスワード | 環境変数 RADIKO_PASSWORD があれば自動指定されます |
|
| -o PATH | 出力パス | 未指定の場合カレントディレクトリに 放送局ID_開始日時_終了日時.m4a というファイルを作成 |
|
| -l | 放送局ID・名称表示 |
*1 どちらかのオプションを指定すること。-t および -d の両方が指定されていた場合、終了日時は長くなるほうに合わせる。
*2 終了日時はスクリプトを実行する日時から40秒以上空けて指定すること。未来の日時を指定したりスクリプト実行直前の日時を指定した場合はエラーが発生、または再生できないファイルが生成されることがある。
# エリア内の局
$ ./rec_radiko_ts.sh -s RN1 -f 201705020825 -t 201705020835 -o "/hoge/2017-05-02 日経電子版NEWS(朝).m4a"
# エリア外の局 (エリアフリー)
$ ./rec_radiko_ts.sh -s YBC -f 201704300855 -t 201704300900 -o "/hoge/2017-04-30 ラジオで詰め将棋.m4a" -m "[email protected]" -p "password"
# エリア外の局 (エリアフリー 環境変数からログイン情報設定)
$ export RADIKO_MAIL="[email protected]"
$ export RADIKO_PASSWORD="password"
$ ./rec_radiko_ts.sh -s YBC -f 201704300855 -t 201704300900 -o "/hoge/2017-04-30 ラジオで詰め将棋.m4a"
# 終了日時ではなく録音時間で指定
$ ./rec_radiko_ts.sh -s RN1 -f 201705020825 -d 10
# 番組URLから
$ ./rec_radiko_ts.sh -u 'http://radiko.jp/#!/ts/YFM/20170603223000'
$ ./rec_radiko_ts.sh -u 'https://radiko.jp/share/?sid=KBC&t=20251029151241' -m "[email protected]" -p "password"
# 年月日時分秒指定
$ ./rec_radiko_ts.sh -s RN1 -f 20251028090112 -t 20251028090328
# 日時(秒)のみ指定
$ ./rec_radiko_ts.sh -s RN2 -f 0900 -t 090351
もっとも単体で動かすよりはcronとして以下のように仕掛けると便利でしょう。
37 8 * * 1,2,3,4,5 rec_radiko_ts.sh -s RN1 -f "`date +\%Y\%m\%d`0825" -t "`date +\%Y\%m\%d`0835" -o "/hoge/`date +\%Y-\%m-\%d` 日経電子版NEWS(朝).m4a"
- Ubuntu 16.04.2
- curl 7.47.0
- xmllint using libxml version 20903
- ffmpeg 3.3.3-1ubuntu1~16.04.york0
- FreeBSD 11.0-RELEASE
- curl 7.55.1
- xmllint using libxml version 20904
- ffmpeg 3.3.3
余談ですが、Windows 10 Creators UpdateビルドでのWindows Subsystem for LinuxのUbuntuでも動作します。
-fや-t、-uで開始や終了日時の秒まで指定した場合でも丸められた秒数の単位(5秒単位)の長さとなる場合があります。-fおよび-tを同一日時(または-d 0)にした場合にm4aは0分ではなく5分間のデータとなりますが、これはラジコ側のバグ仕様のようです。- プレイリストAPIでは5秒単位で時間指定できますが、時間の差を1〜5秒に指定した場合はきちんと5秒のデータが作成されます。
(やっぱりこれバグじゃない?)
- プレイリストAPIでは5秒単位で時間指定できますが、時間の差を1〜5秒に指定した場合はきちんと5秒のデータが作成されます。
- タイムフリー30対象となる期間(30日前から8日前まで)の番組保存は おまけ機能のため将来的なサポートは期待しないでください。
- 保存が非常に遅い(実放送時間分かかる)、または保存失敗となる可能性があります。
- FFmpeg 4.3未満の場合には ffmpeg コマンドの
-http_seekable 0引数を削除してください。
※不具合がある可能性があります!!!
環境変数 RADIKO_CHUNK_DL=1 を設定すると新プレイリスト仕様に特化したモードで動作します。
具体的にはタイムフリー30対象となる期間の番組保存が高速化します。
将来的にはこのモードでしか保存できなくなるかも…
このモードでの注意点等を示します。
-tや-d、-uで指定する終了日時はスクリプト実行時刻から150秒以上空けてください。- 十分でない間隔の場合には実行に時間がかかる、また音声の内容がおかしくなります。 (途中で音が飛ぶ、番組内容がいきなり差し替わったように聞こえます)
/tmpまたは環境変数TMPDIRに設定したディレクトリに一時ファイルを作成するので空き容量には気をつけてください。- 実行中は
recradikots_*という一時ファイルを作成します。
- 実行中は
前述の通り実験的機能のため下記にように必要なときのみ指定することを推奨します。
$ RADIKO_CHUNK_DL=1 ./rec_radiko_ts.sh -s STV -f 202512070000 -d 60 -m "[email protected]" -p "password"
うる。 (@uru_2)
下記のソースコード・情報を参考にさせていただきました。
https://github.com/ez-design/RTFree- http://kyoshiaki.hatenablog.com/entry/2014/05/04/184748
http://mizukifu.blog29.fc2.com/blog-entry-1429.html- https://github.com/ShellShoccar-jpn/misc-tools/blob/master/utconv
- @garret1317 氏による issue #2
RTFreeは実装方法および .NET Core 入れて動かすのちょっとなぁ…という気持ちにさせてくれたという意味で特に感謝しております。