Linux raspberry Pi シェルコマンド シェルスクリプト プログラミング 電子工作

radikoの仕様変更に合わせてraspberry Piのラジオ自動録音・再生スクリプトを更新

 

radiko&らじる★らじる+raspberry Piで最高のラジオ環境

ラジオをよく聴きます。テンポや情報量が今の自分にはちょうどいい感じです。テレビをほとんど見なくなったので、今は完全にテレビよりもラジオの聴取時間の方が多くなりました。

私は、流しっぱなしというよりも決まった番組を毎週聴くスタイルです。NHKの語学講座や朗読、好きなタレントの冠番組なんかを聴いています。

都心は高層ビルが増えるとともに、AMの受信状況がどんどん悪くなっている気がします。電波状況に関係なくネット経由でラジオが聴けるradikoとらじるらじるが始まってからは、いつでもクリアな音声で楽しめるようになりました。これは本当に便利なサービスだと思います。お金払えば地方局も聴けるし。

ウチにはraspberry Piに簡単なアンプとスピーカーを繋いだラジオ専用機があり、お気に入りの番組を定時に自動再生・録音してくれます。

しかも録音したデータは、自動でDropboxにアップロードされるので、アーカイブも手間いらず。いつでもPCやスマホで聴けます。今までで最高のラジオ環境です。

ラズパイで録音システムを組む前は、タイマー録音機能のついたアナログラジオを使ったり、Mac上でAppleScriptとAudio High Jack Proという録音アプリを組み合わせて自動録音していました。

Audio High Jack Proにはタイマーで任意のURLを開いたり、AppleScriptを実行する機能があったので、それでブラウザを開いて、スクリプトでページ内の再生ボタンを自動クリックさせて、番組が終わったらウインドウを閉じるという一連の作業を自動化していました。

AppleScriptとAudio High Jack Proの組み合わせは結構長いこと使っていたのですが、Audio High Jack ProがバージョンアップしてAudio High Jack 3になった際にAppleScriptをサポートしなくなってしまいました。

そこで何か方法はないかなと、探したらraspberry Piでradikoやらじるらじるを聴いている人がいて、ありがたいことにシェルスクリプトも公開してくれていたので、ラジオ難民にならずにすみました。

 

12月に入ったらradikoが自動録音されなくなった

このラジオ専用機、結構長いこと活躍してくれていたのですが、今年2020年の12月に入って民放番組の録音・再生ができなくなりました。

問題があるのはradikoだけで、らじるらじるの方は問題ありません。

ググったり、Twitter検索をしてみたところ、やはりradiko自動録音勢で困っている人が結構いました。なんでもradikoの仕様変更が原因とのこと。radikoの仕様変更は過去にも何度かあって、以前にもシステムを修正したことがあります。

それまで使っていたradiko対応シェルスクリプトの作者さんのページにいくと、「これからはradi.sh」を使ってください」というメッセージが載っていました。

ご本人はもう仕様変更に対応されないようですが、代わりの録音スクリプトを教えてくれていたのです。ありがたい。

というわけで、githubのradi.sh(radish)というシェルスクリプトを使ってシステムを再構築することにしました。

 

ナイスなradiko録音用シェルスクリプト

radishは以下のgithubページにあります。

github: radish

NHK(らじる★らじる)、 radiko、ListenRadio、JCBAインターネットサイマルラジオ、渋谷のラジオをリアルタイム録音でき、ラジコプレミアムにも対応しているという素晴らしいスクリプトです。

radishを使うにはgithubからzipファイルをダウンロードして、解凍後にラズパイに転送して設定します。

必要なアプリケーションやライブラリは

curl、libxml2、jq、FFmpeg の4つ。

私のラズパイでは apt-get install で普通に入れることができました。

あとはREADMEにあるように

 

 command
./radi.sh -t ${サービス名} -s ${局名} -d ${録音時間(分)} -o "出力ファイル名"

 

で、現在放送中の番組を設定した時間だけ録音できます。

いやぁ本当にありがたい!

 

録音しながら再生もしたいので ffmpeg の tee を試すがあっさり撃沈。radishi-play.shのお世話になる

radishは録音用スクリプトなので音が出ません。

私は録音しながらリアルタイムでも聞きたい派なので同時再生にトライしました。

以前のシステムでは、録音と再生のシェルスクリプトを2本同時に走らせていました。でもなんか力業っぽくて、もうちょっとスマートな方法はないかなーと思っていました。

調べてみるとffmpegには tee という機能があって出力を二つ以上に分配できます。これを使ってストリームを録音ファイルとffplayの二つに分配して録音と再生を同時にできると考えました。なんかこっちの方がエレガントな気がします。

で、いろいろやって見たんですが、どうしてもteeが動かない。あと、Macで動いたスクリプトがラズパイで動かなかったりする。

結局諦めて以前と同様に録音と再生それぞれのシェルスクリプトを同時に走らせることにしました。

ここで利用したのは、radishをフォークして作られたradish-play.shというスクリプトです。

github: radishi-play.sh

こちらはradishのffmpeg部分をffplayに書き換えるなどして再生専用のスクリプトにしています。これまたありがたく使わせていただくことにしました。

 

2本のスクリプトを同時に走らせるためにバックグラウンド動作に変更

radishとradish-play.shを同時に走らせるために、少し改造します。

といっても簡単で、ffmpegやffplayを使っている行の最後に & を追加してバックグラウンド動作に変更するだけです。

 

具体的には、

radi.shの#Recordセクションにある "${output}" の後ろに&を付けます。

 
"${output}" &

 

radish-play.shの#Playセクションにある-nodisp の後ろに -autoexit & を付けます。

 
-nodisp -autoexit &

 

-autoexitは指定した時間で自動終了させるためのオプションですが、うまく動かなかったのでなくてもいいかもしれません。あえて消すこともないのでそのままにしています。

 

radishとradish-playを同時に走らせて、時間がきたらffplayをkillするスクリプトを作成

 

これでradishとradish-playを同時に動かせるようになりました。

自動録音・再生をするにはcronで指定時間に起動するように設定します。

crontabの記述があんまり長くなるのも気持ち悪いので、同時起動用のスクリプトを書きました。

私の場合は聴く局が決まっているので、放送局毎にスクリプトを用意することにしました。

例えば、NHK第1放送局用のスクリプトは以下のような感じです。引数として録音時間と保存ファイル名を渡します。

ここで指定したファイル名に日付と時間を付加して保存されます。

 

 shell script
#!/bin/bash
#
day=`date +%Y%m%d`
day_and_time=`date +%Y%m%d_%H%M`
# $1 時間(分) $2 番組名
# 例) rec_nhk_r2.sh 15 番組名
TIMELENGTH=$(($1*60+60))
/home/pi/radio/radi.sh -t nhk -s tokyo-r1 -d $1 -o "/home/pi/radio/rec_files/$2${day_and_time}.m4a"
/home/pi/radio/radish-play.sh -t nhk -s tokyo-r1
{ sleep $TIMELENGTH;killall ffplay; } &
wait
echo "end recording, now upload to dropbox."
/home/pi/radio/upload_to_dropbox.sh ${day}

 

このスクリプトではradi.shを起動した後にすぐにradish-play.shを起動しています。両方ともバックグラウンド動作に改造したので2本同時に動きます。

radishのffmpegを使った録音は設定した時間に自動終了してくれます。残念ながら、radish-play.shで使っているffplayは時間設定をしても終了してくれません。時間指定オプションは用意されていて、単体で使うときは ffplay -t 10 -autoexit とかでイケた気がしますが、今回の使い方ではうまくいきませんでした。

そこで、sleepで番組終了まで待ってkillallコマンドでffplayを強制終了しています。

 shell script
{ sleep $TIMELENGTH;killall ffplay; } &

ちょっと乱暴な気もしますが、以前のシステムから何年も使ってきた実績ある方法です。

 

録音したファイルはDropboxにアップロード

 

最後に日付指定でDropboxにアップロードしています。

raspberry PiでDropboxにアップロードする方法は、以下のブログが分かりやすいです。

Raspberry PiからDropBoxに画像や音声ファイルをアップロードする

 

私の場合はdropbox_uploader.sh を呼び出すスクリプトupload_to_dropbox.shを作成しています。中身はこんな感じ。

 

 upload_to_dropbox.sh
#!/bin/bash
# 録音したラジオ番組をdropboxへアップロードする。引数に日付を付けるとアップロード対象を制限できる
# 通常は、その日のファイルだけをアップする
echo "upload to dropbox"
if [ $# -ne 1 ]; then
#引数が無ければ、全部のファイルをアップロード
~/dropbox_uploader.sh -s upload ~/radio/rec_files/* /radio_rec_pi
else
#引数があれば、その日付のファイルをアップロード
~/dropbox_uploader.sh -s upload ~/radio/rec_files/*$1_* /radio_rec_pi
fi

 

あとはcrontabで番組の時間にスクリプトを起動します。

私のcrontabはこんな感じです。録音時間が番組の設定より1分長いのは、正確な時間を指定すると、バッファで再生が遅れる分だけ最後が切れてしまうからです。

 crontab -l
# m h dom mon dow command
00 11 * * 7 /home/pi/radio/radish_nhk_r2.sh 76 中国語まとめ
00 16 * * 7 /home/pi/radio/radish_t-fm.sh 56 ハピクロ
00 22 * * 7 /home/pi/radio/radish_nippon.sh 31 ももくら
15 8 * * 1-5 /home/pi/radio/radish_nhk_r2.sh 16 まいにち中国語
00 22 * * 1-2 /home/pi/radio/radish_nhk_r2.sh 16 ステップアップ中国語
30 23 * * 7 /home/pi/radio/radish_bunka.sh 31 スマギャン
00 17 * * 6 /home/pi/radio/radish_bunka.sh 16 ももクロパンチ
05 21 * * 4 /home/pi/radio/radish_nhk_r1.sh 57 クイズイマジネーター
45 09 * * 1-5 /home/pi/radio/radish_nhk_r2.sh 16 朗読
45 21 * * 6 /home/pi/radio/radish_nhk_r2.sh 76 朗読まとめ
30 20 * * 5 /home/pi/radio/radish_nhk_r2.sh 31 科学と人間

 

そんなこんなで、今は元通りのラジオライフを楽しめています。詳しい人からすると、なんか間違ってるところがあるかも知れませんが、まぁとりあえず動いているのでオッケーです。

 

追加情報

radiko自動録音器で録音番組がカブったときは、再生は止まるけど録音はOK。しかしDropboxアップロードは失敗するのでファイル共有で救出

以前に作ったradiko自動録音器で録音番組がカブったときの動作と対策についてまとめました

続きを見る

-Linux, raspberry Pi, シェルコマンド, シェルスクリプト, プログラミング, 電子工作

© 2021 make it easy Powered by AFFINGER5