radiko 録音予約ツール

2024/10/09 15:34 LinuxPerl
radiko でインターネット配信されるラジオ番組を、指定した時刻に予約録音するツールを制作しました。

録音には うる。 氏による radish (https://github.com/uru2/radish) を利用しました。
通常では radiko そのままの m4a ファイルで保存されますが、当ツールでは録音後に m4a -> mp3 変換を掛けます。この変換を無効化することもできます。

なお当ツールは radiko 限定としましたが、radish は radiko 以外にも NHK らじる★らじる・リスラジ他多数のネットラジオに対応したソフトです。すばらしい成果を公表してくださいましたことに感謝いたします。

ソースファイル

動作要件

  • Linux など
  • radish が単独で正常に動作していること(パスの通っている場所に配置してください)
  • at (ジョブの遅延実行とバッチ処理) がインストールされていること。

実行方法の例

当ツール rec-radiko.pl を実行権をつけて、パスの通っている場所 (/usr/local/bin/ など) に配置して、
$ rec-radiko.pl [-c|--check] [-n|--no-conversion-to-mp3] <放送局ID> <録音開始日> <録音開始時刻> <録音長(分)> <タイトル>
のように実行してください。
-c または --check任意atコマンドを発行せずに、コマンドの内容を表示します。
-n または --no-conversion-to-mp3任意録音後の mp3 形式への変換をしません。
<放送局ID>必須放送局ID
<録音開始日>必須録音開始する日付を YYYY-MM-DD 形式で指定します。 例: 2024-09-02
<録音開始時刻>必須録音開始する時刻を24時間制で hhmm または hh:mm 形式で指定します。 例: 305, 0305, 3:05, 03:05
<録音長(分)>必須録音の長さを分単位で指定します。 例: 61
<タイトル>必須タイトルを指定します。

環境変数 RADIKO_SAVE_TO に保存先のディレクトリを指定します。
~/.bashrc などに
export RADIKO_SAVE_TO=/var/radiko/save/to
のように追記すればよいでしょう。

放送局ID の確認方法

 $ radi.sh -l | perl -ne 'print if /radiko/../^$/'
を実行すると確認できます。

補足

録音時に f-radiko.smartstream.ne.jp (203.211.199.181) からこちら向きの通信 (TCP/40000台Port宛て) が来るときがあるので、拒絶しないようにします。
拒絶すると録音ができませんでした。ただし必ず来るわけではないです。(しくみがよくわかっていない)

2024-09-11対策済み: at の落とし穴 (?) セット時のカレントディレクトリがなくなってしまったときの問題

このツールでタイマー録音をセットしたのに、録音に失敗するケースがありました。
rec-radiko.pl を実行した時点のカレントディレクトリを削除して(あるいは名前変更して)しまうとダメなようでした。
at -c <job番号> で確認してみると
cd /home/*****/aaaaa/bbbbb || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
のような記述があって、at を読んだときのディレクトリが存在しなくなると失敗させるようになっていました。

サブルーチンの名前付きパラメータでデフォルト値を用意する方法

2023/03/15 21:17 Perl
Joseph N. Hall ほか著『Effective Perl 第2版』(2015, 翔泳社)(https://www.shoeisha.co.jp/book/detail/9784798139814) の p.161 「項目47 名前付きパラメータを渡すにはハッシュを使おう」で、パラメータとデフォルト値を組み合わせるのに
@param { keys %input } = values %input;
を使っていたが、別の方法もあったと記憶していたので、簡単に確認した。


ソース
use strict;
use warnings;
use Data::Dumper;

my %default = (
    a => 100,
    b => 101,
    c => 102,
    d => 103,
);
print Dumper \%default;

my %param = (
    a => 200,
    c => 201,
);
print Dumper \%param;

%param = (%default, %param);
print Dumper \%param;

実行結果
$VAR1 = {
          'c' => 102,
          'd' => 103,
          'a' => 100,
          'b' => 101
        };
$VAR1 = {
          'a' => 200,
          'c' => 201
        };
$VAR1 = {
          'b' => 101,
          'a' => 200,
          'c' => 201,
          'd' => 103
        };

この書籍のコードのような、ハッシュB の内容でハッシュA を上書きするような使い方では、
my %param = (...);
...
@param { keys %input } = values %input;

my %param = (...);
...
%param = (%param, %input);
は等価であることが確認できた。