玩式草子─ソフトウェアとたわむれる日々

第37回  「らじる☆らじる」再び

この記事を読むのに必要な時間:およそ 5 分

日中はまだまだ厳しい残暑が続き,行く夏を惜しむかのように蝉たちが頑張っているものの,朝晩はめっきりと涼しくなって秋の虫たちの合唱も聞こえるようになりました。熱帯夜が続く間は手を付ける気力が出なかった作業にも,少しずつ手を出せるようになってきました。

そのような作業の際の便利なBGMに,昨秋よりNHKがやっているネットラジオ「らじる☆らじる」があります。Linuxで「らじる☆らじる」を聞いたり録音したりする方法については,この連載でも以前取りあげたことがあります。その際は基本となるシェルスクリプトしか解説できませんでしたが,記事の中で紹介したPlamo Linuxのサイトではそれら録音用のシェルスクリプトを生成するためのPythonスクリプトも紹介しておきました。

手元では,このPythonスクリプトを使っていろいろな番組を録音して楽しんでいましたが,予約したい番組が増えるにつれ,スクリプトの欠点が目に付いてきました。最近になって,ようやくその問題点を多少改善することができたので,今回はその事例を紹介してみましょう。

既存スクリプトの問題点

最近のLinux環境では「らじる☆らじる」を予約録音する際に必要なツール類はあらかじめ揃っており,それらをどう組み合わせるかがポイントになります。

以前の記事でも紹介したように,手元では,録音の部分はmplayerlameをシェルスクリプトで組み合わせ,そのスクリプトをatコマンドで指定した時刻に実行することで予約機能を実現しています。これら一連の作業を行うために書いたのがradiru_rec.pyというスクリプトです。

このスクリプトでは,予約録音に必要となるチャンネルや開始・終了時刻以外に,データを保存するファイル名を設定する-t オプションを受けつけ,必要なシェルスクリプトを作成してatのジョブとして登録します。

$ radiru_rec.py -t 'ラジオ英会話「スペシャル・ウィーク」_1' r2 8/27 6:45 7:00
channel:r2
begin time:08/27/2012 06:45
duration(m):15
title:ラジオ英会話「スペシャル・ウィーク」_1
at 06:45 08/27/2012 -f /home/kojima/radiru_scripts/18566
warning: commands will be executed using /bin/sh
job 102 at Mon Aug 27 06:45:00 2012

上記実行例に示すように,radiru_rec.pyスクリプトは,~/radiru_scripts/18566 といったシェルスクリプトを作って,そのシェルスクリプトを番組の開始時刻に実行するようにatに登録しています。

18566はこのシェルスクリプトを作ったPythonスクリプトのプロセス番号で,作成されるスクリプトごとに異なる番号が振られる以外の意味はありません。

radiru_rec.pyは1つの番組を指定するには十分な機能を持っていますが,ラジオ第二の語学講座には月曜から金曜まで同じ時間帯で放送する,いわゆる「帯番組」が多く,それらを予約するためには引数をすこしずつ変えながら,このスクリプトを何回も実行してやる必要があります。

$ radiru_rec.py -t 'ラジオ英会話「スペシャル・ウィーク」_2' r2 8/28 6:45 7:00
$ radiru_rec.py -t 'ラジオ英会話「スペシャル・ウィーク」_3' r2 8/29 6:45 7:00
$ radiru_rec.py -t 'ラジオ英会話「スペシャル・ウィーク」_4' r2 8/30 6:45 7:00
....

もちろん,シェルの履歴(ヒストリ)機能を使えば,最低限の修正だけで次の日の予約も可能ですが,語学講座や教養番組をそれぞれ2,3種類ずつ聞こうとすると,週あたり20近くの番組を予約する必要があり,一々スクリプトを実行するのもかなり手間です。

また,何度もradiru_rec.pyを実行をしているうちに,日時やタイトルを間違って予約してしまうこともよくあります。間違って予約したジョブを削除するには,atqat -cコマンドで該当するスクリプトのジョブIDを調べた上でatrmコマンドで削除する必要があります。

$ atq
102    Mon Aug 27 06:45:00 2012 a kojima
103    Tue Aug 28 06:45:00 2012 a kojima
104    Wed Aug 29 06:45:00 2012 a kojima
105    Thu Aug 30 06:45:00 2012 a kojima

$ at -c 102
#!/bin/sh
# atrun uid=1000 gid=100
# mail kojima 0
umask 22
KDE_MULTIHEAD=false; export KDE_MULTIHEAD
...
#!/bin/sh
sleep 10
mkfifo /tmp/fifo_18566
file=/home/kojima/MP3/ラジオ英会話「スペシャル・ウィーク」_1-`date +"%F-%H-%M"`.mp3
...

$ atrm 102

この作業も結構手間なので,もう少し簡単に予約の確認や取り消しができないか考えてみることにしました。

radiru_rec.pyの再設計

ラジオ第二の語学講座は,通常,月曜から金曜まで同じ時間帯で放送されています。しかし,講座によっては月曜から水曜は基本編で木曜と金曜が応用編になっていたり,月曜と火曜が基本編で水曜から金曜までが実践編になっていることがあります。また,週末の土曜と日曜のみに放送される講座などもあります。

一方,⁠カルチャーラジオ」のような教養番組では,3ヵ月ほどを一単位として,ひとつのテーマを全13回に渡って同じ曜日の同じ時間帯で放送する,という構成が中心ですが,⁠古典購読」のように週に一度の放送が1年間続く,という番組もあります。

これらさまざまな番組構成に柔軟に対応するにはどのような方法が簡単かつ汎用的でしょう? 当初は,日付の指定方法を"Mon-Fri"や"Mon-Wed"のように帯番組用に拡張するような方法を考えてみましたが,曜日での指定は人間の感覚的にはわかりやすいものの,最終的に録音用のシェルスクリプトをatに登録する際には,曜日を「月/日」の形に落しこまないといけないので処理が面倒そうです。

「毎週水曜日の20:00」とか「月曜から金曜までの6:45」のような時刻指定にはcrontabから実行するという方法も可能でしょう。crontabを使えば,登録を解除するまでは指定した時刻にジョブが実行され続けるので,⁠1年間聞き続けたい」ような番組では録り忘れることがなくて便利だとは思うものの,⁠しばらく試し聞きしてみる」程度の番組までcrontabに登録するのはちょっと大袈裟な気がします。何より,指定した時刻にジョブを実行するatと定期的にジョブを繰り返し実行するcrontabでは考え方や設定方法が異なるので,既存スクリプトの修正程度では対応が難しそうです。

それらをあれこれ考えていくうちに,どうやら「毎日」「毎週」という2つの種類の繰り返しパターンを用意して,指定した回数だけ「毎日」「毎週」の予約を繰り返す,というのが一番簡単そうだ,という気がしてきました。

たとえば,月曜から金曜までの帯番組を録音するには,⁠6:45から15分間」の設定を,月曜を起点に「毎日」で5回繰り返せば実現できますし,月曜から水曜までの番組では繰り返しを3回にすればいいでしょう。また「水曜の20:30から21:00まで」「毎週」で4回繰り返せば,週に一度の放送をひと月分まとめて予約できそうです。

偉そうに書いていますが,この程度のタイマー録画機能なら,大昔のビデオデッキにもあったように思います…。

一方,このような繰り返し機能を追加すると,録音したファイル名を区別するために,ファイル名に連番を振るような機能も必要になりそうです。

このように整理した結果,新しいスクリプトには「繰り返し単位を毎日にする」⁠繰り返し単位を毎週にする」⁠繰り返し回数を指定する」⁠ファイル名に付加する連番(の開始番号)を指定する」という4つの機能を追加することにしました。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入