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



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42