foltia-dl.pl  ――foltia ANIME LOCKER 録画データ ダウンローダ

2025/08/28 14:03 LinuxPerlfoltia
自動録画予約ソフトウェア foltia ANIME LOCKER 向けに、同ソフトが動作している Web サイトから録画・録音データをダウンロードするツールを開発しました。mp4 フォーマットのときにはメタデータ(番組名・放送局名・放送時間)も付加して保存します。
foltia ANIME LOCKER は samba サーバ機能も持っていて、そこから録画・録音ファイルを取り出すことも出来るのですが、先に示したようなメタデータは保存されません。また、ファイル名も取り扱いがしやすい形式のものが欲しかった(日付の前に年も欲しい、番組名に含まれる半角記号は全角に直したい)のも本ツール開発の動機です。

ソースファイル

動作要件

  • (当然ながら)foltia ANIME LOCKER が動作しているサーバにHTTPアクセスが可能なこと。
  • (本ツールを動かすマシンに)perl がインストールされていること。
  • (本ツールを動かすマシンに)ffmpeg がインストールされていること。.mp4 ファイルへメタデータを付加するために使用します。

実行方法の例

当ツール foltia-dl.pl を実行権をつけて、パスの通っている場所 (/usr/local/bin/ など) に配置して、
(例1) $ foltia-dl.pl | bash

(例2) $ foltia-dl.pl --grep 'きょうの(料理|健康)' | bash

(例3) $ foltia-dl.pl --tsv

(例4) $ foltia-dl.pl --tsv --grep '御宿かわせみ' > kawasemi.txt
のように実行してください。
標準出力に、シェルで実行可能なコマンドを組み合わせた文字列が出力されます(例1・2)。
TSVモードのとき(例3・4)には、保存先ファイル名・HTTPリクエスト用のパス・番組名・放送局名・放送日時・放送長さが出力されます。

詳細な使い方

  foltia-dl.pl [--tsv] [--grep <title_regexp_string>]
--tsv または -t任意録画録音情報のタブ区切り出力モードになります。指定しないときが通常モードで、シェルで実行可能な文字列を出力します。
--grep <正規表現文字列>任意番組名が<正規表現文字列>に合致した場合のみ出力します。

ソース中の要変更箇所

53行目(あたり)で $FOLTIA_HOST に代入している、foltia ANIME LOCKER が動作している ホスト名またはIPアドレス は、お使いの環境に合わせて書き換えてください。

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

2025/08/27 22:34 PerlLinuxfoltia
自動録画予約ソフトウェア 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";
    }

}

Linux desktop (MATE) でランチャから起動された端末(Terminal)のタイトルを変更する方法

2025/02/07 22:23 Linux
Linux Desktop (MATE) において ワンクリックでアプリケーションを起動させたいとき、カスタム・アプリケーションのランチャをパネルに追加します。
そのソフトが CUI のソフトのときは キーの型を[端末内で機能する]とするのですが、それを起動するときタスクバーに表示されるタイトルが単に[端末]となってしまい、何が実行されているのか分かりづらいです。
Windows の bat ファイルでは title コマンドを使って 実行されているウインドウのタイトルを簡単に変更できるのですが、同様のことを Linux で実現する方法を探しました。

アイコン右クリック > [プロパティ] > [コマンド] に次のように指定します。
bash -c "echo -ne '\033]0;'\"TITLEタイトル\"'\a'; sleep 10 ; exit"

TITLEタイトル がタイトルになります。sleep コマンド以降は適宜実行したいコマンドに置き換えてください。

set_terminal_title.png
実行されている様子

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

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

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

ソースファイル

動作要件

  • Linux など
  • radish が単独で正常に動作していること(パスの通っている場所に配置してください)
    • 2025-09-01現在 "Cannot get playlist URI" エラーが出てしまうので、パッチを当てます。
      220,221c220
      <   uri=$(curl --silent "https://radiko.jp/v3/station/stream/pc_html5/${station_id}.xml" | xmllint --xpath "/urls/url[@timefree='0' and @areafree='${areafree}'][playlist_create_url[not(contains(text(),'_definst_'))]][2]/playlist_create_url/text()" - | sed 's/\&amp;/\&/g' 2> /dev/null)
      <   echo "${uri}?station_id=${station_id}&l=15&type=c&lsid="
      ---
      >   curl --silent "https://radiko.jp/v3/station/stream/aHybrid01/${station_id}.xml" | xmllint --xpath "/urls/url[@timefree='0' and @areafree='${areafree}'][1]/playlist_create_url/text()" - | sed 's/\&amp;/\&/g' 2> /dev/null
      
  • 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 を読んだときのディレクトリが存在しなくなると失敗させるようになっていました。