foltia ANIME LOCKER用 予約重複 チェックツール

2025/07/30 12:48 Perl
自動録画予約ソフトウェア foltia ANIME LOCKER を利用していますが、予約重複でチューナー不足になっているのを見逃して録画に失敗してしまい、残念な思いをすることがあります。
そこで、予約一覧から予約時刻が重複している番組を抽出するツールを作成しました。
Perl で書いてあります。cron で実行すると重複予約があるときだけメールで知らせてくれるように出来ます。

ソース
#!/usr/bin/env perl

use strict;
use warnings;

use HTTP::Tiny;


our $FOLTIA_HOST = 'http://localhost:80';

get_reservation_table('/reservation/');
exit;



sub get_reservation_table {
    my ($path) = @_;
    my $resp   = HTTP::Tiny->new->get($FOLTIA_HOST. $path);
    
    if ($resp->{success}) {
        my $body = $resp->{content};
        while ($body =~ m|<tr.+?</tr>|sg) {
            my $rec = $&;
            $rec =~ s/<br>|\n|\r//g;
            my ($id)      = $rec =~ m|id="(-\d+)"|;
            next unless $id;
            
            my ($station) = $rec =~ m|<td class="station">(.+?)</td>|;
            my ($date)    = $rec =~ m|<td class="date">(.+?)</td>|;
            my ($title)   = $rec =~ m|<td>(.+?)</td>|;
            die "放送局・日時・番組名が取得できませんでした. rec=$rec" unless $station && $date && $title;
    
            print "$id $date $station $title\n" if check_overwrap($id);;
        }
        
        get_reservation_table($1) if $body =~ m|<a rel=next href="(.+?)" >|;
        
    } else {
        die "予約一覧が取得できませんでした. get=$FOLTIA_HOST$path";
    }

}



sub check_overwrap {
    my ($id) = @_;
    
    my $api_url = "${FOLTIA_HOST}/reservation/reservation_overwrap_chk_api.php?p=$id";

    my $resp = HTTP::Tiny->new->get($api_url);
    
    if ($resp->{success}) {
        my $body = $resp->{content};
        if(  my ($overwrap) = $body =~ /"overwrap":"(.*?)"/  ) {
            return $overwrap;
            
        } else {
            die "overwrap 文字列が取得できませんでした. api_url=$api_url";
        }
        
    } else {
        die "overwrap が取得できませんでした. api_url=$api_url";
    }

}

らじる★らじる 録音予約ツール

2025/08/03 20:53 LinuxPerl
らじる★らじる でインターネット配信されるラジオ番組を、指定した時刻に予約録音するツールを制作しました。

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

ソースファイル

動作要件

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

実行方法の例

当ツール rec-nhk-radio.pl を実行権をつけて、パスの通っている場所 (/usr/local/bin/ など) に配置して、
$ rec-nhk-radio.pl [-c|--check] [-n|--no-conversion-to-mp3] <放送局ID> <録音開始日> <録音開始時刻> <録音長(分)> <タイトル>
のように実行してください。
-c または --check任意atコマンドを発行せずに、コマンドの内容を表示します。
-n または --no-conversion-to-mp3任意録音後の mp3 形式への変換をしません。
<放送局ID>必須放送局ID 例: tokyo-r1, r2, tokyo-fm
<録音開始日>必須録音開始する日付を 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
を実行すると確認できます。

2025-08-03

もともと radiko 専用としていましたが、radish での radiko 対応が残念ながら終えられてしまったので、本ツールも らじる★らじる 専用として改修しました。

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);
は等価であることが確認できた。