Skip to content

uru2/rec_radiko_ts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 

Repository files navigation

rec_radiko_ts

ラジコタイムフリーの番組を保存するシェルスクリプトです。
必要な外部ツールは最小限に、またash,dashでも動作するよう努めています。

必要なもの

  • curl
  • libxml2 (xmllintのみ使用)
  • FFmpeg (3.x以降 要AAC,HLSサポート)

使い方

$ ./rec_radiko_ts.sh [options]
引数 必須 説明 備考
-s STATION 放送局ID -l で表示されるID
-f DATETIME 開始日時 JSTでの日時 (dateコマンドでの書式)
  • %H%M (時分のみ、日付は実行日で補完)
  • %H%M%S (時分秒のみ、日付は実行日で補完)
  • %Y%m%d%H%M (年月日時分)
  • %Y%m%d%H%M%S (年月日時分秒)
-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 終了日時はスクリプトを実行する日時から90~150秒以上(放送局による)空けて指定すること。秒数は -l で確認できます。

実行例

# エリア内の局
$ ./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 "foo@example.com" -p "password"

# エリア外の局 (エリアフリー 環境変数からログイン情報設定)
$ export RADIKO_MAIL="foo@example.com"
$ 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 "foo@example.com" -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"

動作確認環境

  • FreeBSD 15.0-RELEASE
    • curl 8.17.0
    • xmllint using libxml version 21501
    • ffmpeg 8.0.1
  • Debian 12.13
    • curl 7.88.1
    • xmllint using libxml version 20914
    • ffmpeg 5.1.8-0+deb12u1

Windows Subsystem for Linux(WSL)上にLinux実行環境を構築しても動作します。

注意事項など

  • -f-t-u で開始や終了日時の秒まで指定した場合でも丸められた秒数の単位(5秒単位)の長さとなる場合があります。
  • -f および -t を同一日時(または -d 0 )にした場合にm4aは0分ではなく5分間のデータとなりますが、これはラジコ側の バグ 仕様のようです。
    • プレイリストAPIでは5秒単位で時間指定できますが、時間の差を1〜5秒に指定した場合はきちんと5秒のデータが作成されます。 (やっぱりこれバグじゃない?)
  • タイムフリー30対象となる期間(30日前から8日前まで)の番組保存は おまけ機能のため将来的なサポートは期待しないでください。
  • FFmpeg 4.3未満の場合には ffmpeg コマンドの -http_seekable 0 引数を削除してください。
  • -t-d-u で指定する終了日時はスクリプト実行時刻から90~150秒以上空けてください。
    • 十分でない間隔の場合には実行に時間がかかる、また音声の内容がおかしくなります。 (途中で音が飛ぶ、番組内容がいきなり差し替わったように聞こえます)
    • 必要な秒数は -l オプションで確認
  • /tmp または環境変数 TMPDIR に設定したディレクトリに一時ディレクトリを作成するので空き容量には気をつけてください。
    • 実行中は recradikots_* という一時ディレクトリを作成します。
  • libxml2 v2.9.8以下(xmllintバージョン表記が20908以下)には不具合があります。
    • -l オプションは利用できません。
    • スクリプト中 get_hls_urls の一部を下記に差し替えてください。
  # TimeFree 30 playlist (Possibly bandwidth limited)
  #  1st line: Main playlist, requires the "-http_seekable 0" option in ffmpeg >= 4.3 (Suppresses HTTP "Range" request headers)
  #  2nd line: Sub playlist
  # libxml2 v2.9.8 or earlier bug hack
  playlist_res=$(curl --silent "https://radiko.jp/v3/station/stream/pc_html5/${station_id}.xml")
  counts=$(echo "${playlist_res}" | xmllint --xpath "count(/urls/url[@timefree='1' and @areafree='${areafree}']/playlist_create_url)" -)
  i=1
  while [ "${i}" -le "${counts}" ]; do
    echo "${playlist_res}" | xmllint --xpath "(/urls/url[@timefree='1' and @areafree='${areafree}']/playlist_create_url/text())[${i}]" - | printf '%s\n' "$(cat)"
    i=$((i + 1))
  done

作った人

うる。 (@uru_2)

ライセンス

MIT License

謝辞

下記のソースコード・情報を参考にさせていただきました。

RTFreeは実装方法および .NET Core 入れて動かすのちょっとなぁ…という気持ちにさせてくれたという意味で特に感謝しております。

About

Radiko timefree program recorder

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages