2026年10月6日火曜日

<備忘録>自動録音された推しのラジオを外出先からiPhoneで聴く

以前、Raspberry Piに「rfriends3」を導入して、WEBラジオを自動録音できる環境を作りました。これで毎週決まった時間に放送される推しのラジオを、Raspberry Piが勝手に録音してくれるようになりました。
めでたしめでたし。……だったのですが、人間というものは便利になると、さらに欲が出てくるものです(笑)。

「せっかく自動録音しているんだから、外出先からiPhoneですぐ聴きたい!」

Raspberry Piは自宅のLAN内に置いてあります。Sambaで共有しているので、自宅にいればiMacやiPhoneから録音ファイルを開くことができます。しかし外出中はそうはいきません。そこで、

Raspberry Pi → iMac → iCloud Drive → iPhone
 
というルートで、録音されたファイルをiCloud Driveへ自動コピーしてしまうことにしました。Raspberry PiからiCloud Driveへ直接コピーできれば一番シンプルなのですが、LinuxからiCloud Driveを扱うのはいろいろ面倒そう。だったら、iCloud Driveとの同期はiMacにやらせればええやん!という、若干無理やりな方法です(笑)。しかも録音をコピーするためだけにiMacをずっと起動しておくのも嫌なので、

必要な時間になったらiMacを勝手に起こす → iCloudへコピー → 終わったらまた寝てもらう
 
ところまで自動化してみました。最終的な構成はこんな感じです。

WEBラジオ
   ↓
Raspberry Pi
   │ 自動録音
   ↓
Samba
   ↓
iMac
   │ 自動起動
   │ 録音ファイルを自動コピー
   ↓
iCloud Drive
   ↓
iPhone
   │
   └→ 外出先から再生!
ざっくりステップ
 <STEP1> Raspberry Piの録音ファイルをiMacから確認する
 <STEP2> iCloud Driveに録音保存用フォルダを作る
 <STEP3> 録音ファイルを自動コピーするスクリプトを作る
 <STEP4> LaunchAgentで毎日決まった時間に実行する
 <STEP5> Sambaをログイン時に自動マウントする
 <STEP6> iMacを決まった時間に自動で起こす
 <STEP7> コピーが終わったらiMacにまた寝てもらう
 <STEP8> 外出先からiPhoneで聴く!
 
詳細は以下。 
 
<STEP1> Raspberry Piの録音ファイルをiMacから確認する
まず前提として、Raspberry PiでWEBラジオを自動録音できるところまでは、前回の記事で構築済みです。Raspberry Piの録音データはSambaで共有しており、iMacからは、
/Volumes/smbdir/
としてアクセスできるようにしています。WEBラジオの録音ファイルは今回、
/Volumes/smbdir/usr2/webradio/jcba/
以下に保存されています。録音されるファイルはM4A形式。まずはiMacのターミナルから、
ls -lt /Volumes/smbdir/usr2/webradio/jcba/
などを実行して、録音ファイルが見えることを確認します。ここまでできれば、Raspberry Pi → Samba → iMacまではOKです。
 
<STEP2> iCloud Driveに録音保存用フォルダを作る
続いて、録音ファイルを保存するiCloud Drive側のフォルダを作ります。今回はiCloud Driveの「ドキュメント」以下に、
fmmiki
というフォルダを作りました。macOSから見ると、
$HOME/Library/Mobile Documents/com~apple~CloudDocs/ドキュメント/fmmiki
になります。まずは手動でコピーできるか確認。
cp "/Volumes/smbdir/usr2/webradio/jcba/録音ファイル.m4a" \ "$HOME/Library/Mobile Documents/com~apple~CloudDocs/ドキュメント/fmmiki/"
コピー後、iPhoneの「ファイル」アプリから、
iCloud Drive └ ドキュメント └ fmmiki
を開いてみます。おお!Raspberry Piで録音したM4AファイルがiPhoneから見える!もちろん、そのままiPhoneで再生することもできました。これで、
 
Raspberry Pi → iMac → iCloud Drive → iPhone
 
というルートそのものは成立しました。
 
<STEP3> 録音ファイルを自動コピーするスクリプトを作る
手動コピーでは意味がないので、次は自動化します。iMacに、
~/bin/fmmiki_to_icloud.sh
というシェルスクリプトを作りました。中身はこんな感じ。
#!/bin/bash PATH=/usr/bin:/bin:/usr/sbin:/sbin export PATH SOURCE="/Volumes/smbdir/usr2/webradio/jcba" DEST="$HOME/Library/Mobile Documents/com~apple~CloudDocs/ドキュメント/fmmiki" LOG="$HOME/bin/fmmiki_to_icloud.log" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG" } log "START" # Sambaが接続されていなければ終了 if [ ! -d "$SOURCE" ]; then log "SKIP: Samba not mounted" exit 0 fi # 最新のM4Aを1本取得 LATEST=$(ls -t "$SOURCE"/*.m4a 2>/dev/null | head -1) # M4Aがなければ終了 if [ -z "$LATEST" ]; then log "SKIP: No M4A file" exit 0 fi # 録音中のファイルを避けるため、更新から5分以内なら終了 NOW=$(date +%s) MODIFIED=$(stat -f %m "$LATEST") AGE=$((NOW - MODIFIED)) if [ "$AGE" -lt 300 ]; then log "SKIP: Latest file is too new (${AGE}s)" exit 0 fi FILENAME=$(basename "$LATEST") # iCloud側にすでに存在する場合 if [ -e "$DEST/$FILENAME" ]; then log "SKIP: Already exists: $FILENAME" exit 0 fi # 最新の1本をiCloudへコピー log "COPY: $FILENAME" if rsync -a --ignore-existing "$LATEST" "$DEST/"; then log "SUCCESS: $FILENAME" else log "ERROR: rsync failed: $FILENAME" exit 1 fi
ポイントは、単純に全部コピーするのではなく、一番新しいM4Aファイルだけを対象にしていること。さらに、
  • Sambaがマウントされていなければ何もしない
  • M4Aがなければ何もしない
  • 更新から5分以内なら録音中の可能性があるので何もしない
  • iCloudに同じファイルがあれば何もしない
  • コピーに成功・失敗したらログを残す
という処理を入れています。元ファイルを削除する処理は入れていないので、万一iCloudへのコピーに失敗しても、Raspberry Pi側の録音ファイルはそのまま残ります。

<STEP4> LaunchAgentで毎日決まった時間に実行する
次はシェルスクリプトを自動実行します。macOSなのでcronではなく、今回はlaunchdのLaunchAgentを使用しました。作成したファイルはこちら。
~/Library/LaunchAgents/com.osamuchan.fmmiki-to-icloud.plist
設定はこんな感じ。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.osamuchan.fmmiki-to-icloud</string> <key>ProgramArguments</key> <array> <string>/Users/xxxxxxxx/bin/fmmiki_to_icloud.sh</string> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>20</integer> <key>Minute</key> <integer>5</integer> </dict> </dict> </plist>
これで毎日20:05にスクリプトが起動します。設定を読み込み。
launchctl load ~/Library/LaunchAgents/com.osamuchan.fmmiki-to-icloud.plist
実際にlaunchdが認識している設定も確認しました。
launchctl print gui/$(id -u)/com.osamuchan.fmmiki-to-icloud
最終的には、
"Minute" => 5 "Hour" => 20
となっていればOK。なお、最初は月曜日だけ動かそうと思ってWeekdayも指定していました。ところが私の環境(macOS Catalina)で実際にテストしたところ、Macがスリープして実行時刻をまたいだ場合の動作が思ったようにならなかったため、LaunchAgent側は曜日を指定せず毎日20:05としました。Mac自体を月曜日しか起こさなければ、通常はそれで問題ありません。
 
<はまり1> macOSの権限
これで完成!……と思ったのですが、ここでハマりました(笑)。ターミナルからシェルスクリプトを実行するとSambaのファイルが見えるのに、LaunchAgentから実行すると、
Operation not permitted
となってしまいました。原因はmacOSのプライバシー設定。私のCatalina環境では、
システム環境設定 → セキュリティとプライバシー → プライバシー → フルディスクアクセス
から、
/bin/bash
にフルディスクアクセスを許可することで解決しました。これでLaunchAgentから実行したシェルスクリプトでもSamba共有を参照できるようになりました。この辺、macOSらしいところです(笑)。
 
<STEP5> Sambaをログイン時に自動マウントする
当然ながら、iMacが起きてもSamba共有が接続されていなければ録音ファイルをコピーできません。そこで、
/Volumes/smbdir
をmacOSのログイン項目に登録しました。再起動後、
ls /Volumes
を実行して、
Macintosh HD smbdir
と表示されることを確認。これでMacへログインすると、Raspberry PiのSamba共有も自動的に接続されます。
 
<STEP6> iMacを決まった時間に自動で起こす
ここまで来ると、あと一歩。録音ファイルをコピーするためだけにiMacを一日中起動しておくのは、なんとなく気持ち悪い(笑)。そこで、macOSのpmsetを使って、必要な時間だけMacを起こすことにしました。 WEBラジオの録音時間が、
毎週月曜日 19:30~20:00
なので、
20:00 iMac起動 20:05 iCloudへコピー 20:10 スリープ処理開始
とします。設定したコマンドはこちら。
sudo pmset repeat wakeorpoweron M 20:00:00 sleep M 20:10:00
確認。
pmset -g sched
私の環境では、
Repeating power events: wakepoweron at 8:00PM Monday sleep at 8:10PM Monday
となりました。
 
<はまり2> 「wake」ではなく「wakeorpoweron」
実はここでもハマりました(笑)。最初は、
wake
を指定していました。ところが実際にMacをスリープさせて実験すると、期待したように通常のWake状態にならず、LaunchAgentが動きませんでした。そこでpmsetのマニュアルを確認して、
wakeorpoweron
に変更。すると、Macが自動的にWake → 5分後にLaunchAgentが自動実行するところまで確認できました。テスト時のログはこちら。
2026-10-05 22:15:03 START 2026-10-05 22:15:03 SKIP: Already exists: ...
この時はすでにコピー済みだったのでSKIPになっていますが、重要なのは、人間がMacに一切触っていない状態でLaunchAgentが起動したこと。これでいけそうです。
 
<STEP7> コピーが終わったらiMacにまた寝てもらう
最後は自動スリープ。pmsetで20:10にsleepを設定しています。面白かったのは、私の環境では20:10になった瞬間にいきなりスリープするわけではありませんでした。スリープ予定時刻になると、

「このコンピュータは自動的にスリープ状態になるようにスケジュールされています」

という画面が表示され、カウントダウン開始。実際にテストしたところ、約10分後に自動的にスリープしました。したがって現在は、
19:30 Raspberry Pi 録音開始 20:00 Raspberry Pi 録音終了 20:00 iMac 自動Wake 20:05 LaunchAgent起動 Samba → iCloud Driveへ自動コピー 20:10 scheduled sleep発動 20:20 iMac 自動Sleep
という流れになっています。録音終了からコピーまで5分、コピー開始からscheduled sleepまで5分、さらに実際のSleepまでは約10分。M4Aファイル1本をコピーするには十分な余裕があります。
 
<STEP8> 外出先からiPhoneで聴く!
ここまで設定すれば、人間がやることはほとんどありません。毎週月曜日になると、
WEBラジオ ↓ Raspberry Pi ↓ 自動録音 Samba ↓ iMac ↓ 自動Wake ↓ 自動コピー iCloud Drive ↓ iPhone
と勝手にファイルが流れていきます。そしてiMacは用事が終われば、また勝手に寝ます(笑)。外出先ではiPhoneの「ファイル」アプリからiCloud Driveを開くだけ。これで、自宅に帰らなくてもRaspberry Piで録音された推しのラジオを聴ける!
 
<まとめ>
ということで、
「Raspberry Piで自動録音した推しのラジオを、外出先からiPhoneですぐ聴きたい」 
というだけの話だったのですが、気がつけば、
Raspberry Pi + Samba + shell script + launchd + pmset + iCloud Drive
という、なかなか壮大な仕組みになってしまいました(笑)。でもこれがなかなか楽しい。 
 Raspberry Piは録音担当。 
 iMacは必要な時間だけ起きてファイル転送担当。 
 iCloud Driveは外出先への受け渡し担当。 
 iPhoneは再生担当。
それぞれが勝手に仕事をしてくれます。