はじめに
以前にラズパイ3bにvolumioを作成したのですが、あんまり活躍する機会がないので、ラジコを録音するような仕組みにしようとチャレンジしました。
ですが、色々なDockerを試してみましたが、全く上手く行きません。
結論として分かったのは、ラジコは運営側とのイタチごっこなようで。。
果てしない追いかけっことなるようです。
「あぁ、それじゃ、だめだなぁ。」となった訳ですが、
なにか、音楽番組が録音できればいいのだけど?と思って、調べると、
ネットラジオがあるので、それを定期的に録音させてもらおうと思ったわけです。
しかも、ログは明瞭に、スクリプトは保守しやすく、録音ファイルは整理されていてほしい。
そんな思いから始まった、Raspberry PiによるRadiko録音システムの構築の巻です。
良かったら、読んでみてください。
構成概要
ラズパイ3Bを有効活用したいので、システム(アプリ)だけラズパイ3Bで録音とスケジュールファイルはSynologyのNASで管理します。
- 録音対象:ネットラジオ(例:DanceMachine:https://www.radiojapan.org/ae/dance-machine)
- 録音方式:ffmpegによるストリーム録音
- スケジュール管理:NAS上のconfig.json
- 実行環境:Raspberry Pi 3(IP: 192.168.0.74)
- 保存先:Synology NAS(/volume1/radiko)をラズパイにマウント(/mnt/music/radiko)
ストリームURLの取得方法
対象サイト(例:https://www.radiojapan.org)でF12 → ネットワークタブ → 「radio.aac」などを右クリック → URLをコピー。
例:https://ice1.streeemer.com:8030/radio.aac
マウント設定(ラズパイ側)
sudo mkdir -p /mnt/music/radiko
sudo mount -t cifs -o username=user,password=yourpass,vers=3.0,uid=1000,gid=1000 //192.168.0.4/radiko /mnt/music/radiko
自動マウントは /etc/fstab
に記述。
録音予約(config.json)
[
{
"title": "DanceMachine",
"url": "https://ice1.streeemer.com:8030/radio.aac",
"start": "2025-09-13T07:00:00+09:00",
"duration": 3600
}
]
録音スクリプト(record_radio.sh)
#!/bin/bash
CONFIG="/mnt/music/radiko/config.json"
SAVE_DIR="/mnt/music/radiko"
NOW_EPOCH=$(date +%s)
jq -c '.[]' "$CONFIG" | while read -r entry; do
title=$(echo "$entry" | jq -r '.title')
url=$(echo "$entry" | jq -r '.url')
start=$(echo "$entry" | jq -r '.start')
duration=$(echo "$entry" | jq -r '.duration')
start_epoch=$(date -d "$start" +%s)
end_epoch=$((start_epoch + duration))
if [ "$NOW_EPOCH" -ge "$start_epoch" ] && [ "$NOW_EPOCH" -le "$end_epoch" ]; then
timestamp=$(date -d "$start" +"%Y%m%d_%H%M")
filename="${SAVE_DIR}/${title}_${timestamp}.m4a"
ffmpeg -i "$url" -t "$duration" -c copy "$filename"
fi
done
cron設定(毎分チェック)
crontab -e
* * * * * /home/volumio/record_radio.sh
トラブルシューティング
- Permission denied → マウント時にuid/gid指定 or chown
- ffmpegエラー → URLが音声ストリームでない可能性。
.aac
,.mp3
,.m3u8
を探す - crontabが使えない →
sudo apt install cron
→systemctl enable/start cron
- 録音されない →
start
時刻が過去 or 未来すぎる。±60秒の範囲で判定 - 再生できない → 拡張子を
.m4a
にすると互換性向上
改善と運用美の実践
- ロケールを
ja_JP.UTF-8
に設定し、日本語ログの文字化けを解消 nano
の代わりにmicro
エディタを導入し、日本語表示を安定化- 過去のスクリプトが吐いていた
rec.log
を整理し、ログをrecord_log.txt
に統一 - スクリプトに録音成功・失敗・スキップのログ出力を追加し、透明性を確保
■ microエディタの使い方(推奨)
- インストール(1行でOK)
curl https://getmic.ro | bash
- →
micro
実行ファイルがカレントディレクトリに作成される - スクリプトを開く
./micro record_radio.sh
- 基本操作
- 保存:
Ctrl + S
- 終了:
Ctrl + Q
- 検索:
Ctrl + F
- 行番号表示:
Alt + G
(ジャンプも可能)
- 保存:
- 特長
- 日本語表示が安定(文字化けしない)
- カラー表示で見やすい
nano
と同じ感覚で使えるが、操作性はより快適- 設定ファイルでカスタマイズも可能(~/.config/micro)
- 補足
micro
はインストール不要で、実行ファイルだけで動作- 必要なら
/usr/local/bin
に移動して、どこからでも呼び出せるようにできるsudo mv micro /usr/local/bin/
今後の拡張案
- weekdayベースの繰り返し録音
- StreamTitleのログ化(曲名履歴)
- n8nやNode-REDによるGUIスケジューリング
- Grafanaで録音成功率や容量を可視化
まとめ
録音が成功したときに走ったログに「録音成功」と出たときは気持ちよかったなぁ。
これで色んな音源を聞くことが出来るようになって嬉しいです。
録音したファイルはダウンロードして、通勤時に車で聞くつもりです。
参考になれば幸いです。