[[diary/Kojima]]

・「らじる★らじる」タイマー録音スクリプト

また、前回から1ヶ月近く空いてしまった。。

最近、NHKがラジオ放送を「らじる★らじる」という名前でインターネットでも同時放送するようになったので、
少し調べてみたところ asx フォーマットを使えばmplayerだけでも利用できるらしい。

mplayerで再生できるなら、その出力をlameあたりに食わせればMP3形式で保存できるので、
こんな感じのタイマー録音スクリプトを書いてみた。

 #!/bin/sh
 
 if [ $# != 3 ]; then
     echo 'Usage:'
     echo "  $0 [r1|r2|fm] start_time end_time"
     exit 1
 fi 
 
 channel=$1
 start=$2
 end=$3
 
 date=`date +"%F"`
 file="~/"$channel"-"$date"-"$start".mp3"
 my_pid=$$
 mp3dir="~/MP3"
 
 case $channel in
     r1)
     playlist=http://mfile.akamai.com/129931/live/reflector:46032.asx
     ;;
   r2)
     playlist=http://mfile.akamai.com/129932/live/reflector:46056.asx
     ;;
   fm)
     playlist=http://mfile.akamai.com/129933/live/reflector:46051.asx
     ;;
   *)
     echo 'Usage:'
     echo '  $0 [r1|r2|fm] start_time end_time'
     exit 1
     ;;
 esac
 
 mkdir -p ~/radiru_scripts 
 
 cat <<EOF > ~/radiru_scripts/begin_$my_pid
 #!/bin/sh
 mkfifo /tmp/fifo_$my_pid
 file=$mp3dir"/"\$channel"-"\`date +"%F-%H-%M"\`".mp3"
 mplayer -slave -input file=/tmp/fifo_$my_pid -playlist $playlist -ao pcm:file=/dev/stdout -vc null -really-quiet -quiet | lame --quiet -q 4 -  $file 2> /dev/null
 EOF
 
 cat <<EOF > ~/radiru_scripts/end_$my_pid
 #!/bin/sh
 echo "quit" > /tmp/fifo_$my_pid
 rm -f /tmp/fifo_$my_pid
 rm -f ~/radiru_scripts/{begin,end}_$my_pid 
 EOF
 
 at $start -f ~/radiru_scripts/begin_$my_pid
 at $end -f ~/radiru_scripts/end_$my_pid
 
例えばこのスクリプトを rec_radiru.sh とでもしておけば、引数として、チャンネル(fm, r1, r2)と開始時刻、
終了時刻の3つを指定して、

 rec_radiru.sh fm 20:00 22:30
 rec_radiru.sh r2 19:00 19:15

みたいな感じで実行すれば、~/radiru_scripts/{begin,end}_$my_pid というシェルスクリプトを作って、
それらのスクリプトを指定時刻に実行するように at コマンドに登録している。

録音した内容は fm-2011-11-02-13:00.mp3 みたいに、"チャンネル名"+"開始時刻".mp3 という名前でホームディレクトリに保存される。

一番苦労したのは、シェルスクリプトをkillしてもmplayer自体は終了しないあたりで、
当初はシェルスクリプトのPID+1をmplayerのPIDと見なして kill するようなコードにしていたのだけど、
それだとタイマー録音が始まる時刻に複数のコマンドを起動するような場合(NHK-FMとラジオ第一を同時に録音し始めるとか、
その時刻にcronが動くとか)にうまく行かない(タイミングによってPIDがずれるので、必ずしも$$+1でmplayerのPIDにはならない)ので、
起動スクリプトではmplayerをslaveモードで起動して、専用のFIFO経由で終了スクリプトからquitコマンドを受けとるようにしたところ。
こうすることで、一応、手元では同じ時刻に複数の録音スクリプトを起動しても、それぞれ別個に終了できている模様。

当初は1つのスクリプトで指定時間だけsleepしてからmplayerをkillするようなコードを考えてたのだけど、
日付をまたがったときの時刻指定とかを考えるのが面倒だったので、そのあたりは at コマンドに投げてしまったけど、
こうしておけばatコマンドで使える日付書式がそのまま使えるので、案外便利かもと思っているところ。

このあたりに晒しておけば、デバッグや機能追加してくれる奇特な人も現われるだろう(w
- データのファイル名をrec_radiru.sh を実行時点に生成しちゃってるので、時刻を翌日にした場合、ファイル名がうまく行かないですね。begin_$my_pidの中でファイル名を生成するようにした方がよさそうだ。 -- [[kojima]] &new{2011-11-03 (木) 12:42:20};
- 差分を取るほどのコードでもないので直接イジって、$fileをstartスクリプトの方で生成するようにしてみた。 -- [[kojima]] &new{2011-11-04 (金) 10:01:21};
- ついでに~/MP3ディレクトリに入れるようにしたので、MP3ディレクトリは別途用意しておく必要あり。 -- [[kojima]] &new{2011-11-04 (金) 10:02:20};
- NTPで時刻は合わせているのに、ちょうどに始まらないなぁ、、と思っていたら、インターネット中継の方が15秒くらい遅れてるのかな? -- [[kojima]] &new{2011-11-04 (金) 10:26:32};
- atコマンドで翌日以降の時刻を登録するためには日付の情報も渡さないといけないので、引数のパースが面倒になりそう。シェルスクリプトで頑張るよりは、早めにpythonあたりで書き直した方がいいかも知れんな。 -- [[kojima]] &new{2011-11-05 (土) 18:22:40};
- いや、おもしろそう、、。ネットラジオは残響がない感じだったので、遠慮したのだけれど、この際、また活用を考えてみるかな。 -- [[きゅうる村]] &new{2011-11-09 (水) 18:18:46};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS