« ホームズくん史上最強の難問 | メイン | サイドバーほか再編 »

2010年08月24日(火)

LinuxでFriio録画 キーワード自動録画

久しぶりにfriioネタ。

簡易延長対応以降、何度となく救われているのだが、さすがに予約作業を忘れると救われないわけで、自律キーワード録画機能を作ってみた。

例によって動作すれば何でもOKな作り方をしているので、参考にはしづらいと思うが…

諸般の事情でcronがroot権限で毎朝動かしている。
各チャンネルを記録して、epgdumpで番組情報を取得。
(BSは全チャンネル分のデータがそれぞれのチャンネルで取れるので、1回だけ。)
"words"ファイルは番組タイトルでヒットさせたいもの。
"dwords"ファイルは番組内容でヒットさせたいもの。
をそれぞれ比較して、ヒットしたら番組名の前に"○"を付けて録画予約のcrontabに登録する…だけ。
"○"が付いてたら自動予約されたもの…ということで。

コレで録画漏れは防げる…ハズ。
ただし、いずれ書くが全て再エンコードしてるとディスクが一杯になってしまうし負荷も大きくなるので、手動録画の場合だけエンコードする様に改めた。

ソースを見せるだけでも恥ずかしい内容だが、以下。
●auto_book.pl

#!/usr/bin/perl

$flg = @ARGV[0];

$merge_file = '/work/epg_book.merge';
$book_file = '/work/epg_book.cron';
$auto_file = '/work/epg_book.auto';
$epgdump = '/usr/local/bin/epgdump -l';
$recfriio = '/usr/local/bin/recfriio --b25 --strip';
$rec_sec = 120;
$words_file = '/work/words';
$dwords_file = '/work/dwords';
$tmp_dir = '/tmp';

@words = `nice -5 cat $words_file`;
@dwords = `nice -5 cat $dwords_file`;

$cron_user = 'friio';
$path = 'PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin';
$mailto = 'MAILTO=\'\'';

@ch[0] = "27,NHKG,1024";# NHK総合
@ch[1] = "26,ETV1,1032";# NHK教育1
@ch[2] = "26,ETV3,1034";# NHK教育3
@ch[3] = "32,TVS,29752";# テレビ埼玉
@ch[4] = "25,NTV,1040"; # 日本テレビ
@ch[5] = "24,EX,1064";  # テレビ朝日
@ch[6] = "22,TBS,1048"; # TBSテレビ
@ch[7] = "23,TX,1072";  # テレビ東京
@ch[8] = "21,CX,1056";  # フジテレビ
@ch[9] = "20,MX,23608"; # MXテレビ
@ch[10] = "B101,BS1,101"; # NHKBS1
@ch[11] = "B102,BS2,102"; # NHKBS2
@ch[12] = "B11,BShi,103"; # NHKBShi
@ch[13] = "B8,BS4,141"; # BS日テレ
@ch[14] = "B1,BS5,151"; # BS朝日
@ch[15] = "B2,BS6,161"; # BSTBS
@ch[16] = "B4,BS7,171"; # BSジャパン
@ch[17] = "B9,BS8,181"; # BSフジ
@ch[18] = "B3,BS9,191"; # WOWWOW
@ch[19] = "B5,BS11,211"; # BS11
@ch[20] = "B7,BS12,222"; # TwellV

if ($flg == 1){&OPEN_EPG_LOG;}
else {&GET_EPG;}

### GET_EPG ###
sub GET_EPG {
foreach $ch(@ch){
        ($rec_ch, $ch_name, $epg_ch) = split /,/, $ch;
        if ($ch_name =~ /^BS/){
                if ($bs_flg != 1) {
                        $rec_sec_bs = $rec_sec * 1.5;
                        @bs_lines = `nice -5 $recfriio B1 $rec_sec_bs - | $epgdump | grep "^SEVT," | sort -t , -k 4 -u`;
                        $bs_flg = 1;
                        `nice -5 date \"+%Y-%m-%d\" > $tmp_dir/BS.epg`;
                        foreach (@bs_lines){`nice -5 echo -n "$_" >> $tmp_dir/BS.epg`;}
                } # if
                @lines = grep /^SEVT,$epg_ch/, @bs_lines;
        } # if
        else {@lines = `nice -5 $recfriio $rec_ch $rec_sec - | $epgdump | grep "^SEVT,$epg_ch" | sort -t , -k 4 -u`;}
        `nice -5 date \"+%Y-%m-%d\" > $tmp_dir/$ch_name.epg`;
        foreach (@lines){`nice -5 echo -n "$_" >> $tmp_dir/$ch_name.epg`;}
        push @epg, @lines;
} # foreach
} # sub GET_EPG

### OPEN_EPG_LOG
sub OPEN_EPG_LOG {
foreach $ch(@ch){
        ($rec_ch, $ch_name, $epg_ch) = split /,/, $ch;
        open FH, "$tmp_dir/$ch_name.epg";
        @lines = <FH>;
        close FH;
        shift @lines;
        push @epg, @lines;
} # foreach
} # sub OPEN_EPG_LOG

my%seen;
@uniq = grep {!$seen{$_}++} @epg;

foreach $epg(@uniq){
        chomp $epg;
        $chk = 0;
        foreach $dword(@dwords){
                chomp $dword;
                if ($dword =~ /^$/ || $dword =~ /^#/) {next;}
                elsif ($epg =~ /$dword/){push @hits, $epg; $chk = 1; last;}
        } # foreach
        if ($chk == 1){next;}
        else {
                $epg_s = $epg;
                $epg_s =~ s/,[^,]*$/,/g;
                foreach $word(@words){
                        chomp $word;
                        if ($word =~ /^$/ || $word =~ /^#/) {next;}
                        if ($epg_s =~ /$word/){push @hits, $epg; last;}
                } # foreach
        } # else
} # foreach

foreach $hit(@hits){
        chomp $hit;
        ($dummy, $epg_ch, $epg_id, $dummy, $epg_date, $epg_start, $epg_end, $dummy, $epg_sec, $epg_title, $dummy) = split /,/, $hit;
        @match = grep /^[^,]*,[^,]*,$epg_ch$/, @ch;
        if (@match[0] eq '') {next;}
        ($rec_ch, $ch_name, $epg_ch) = split /,/, @match[0];
        $auto_date = `nice -5 date -d \'$epg_date $epg_start 1 min ago\' \'+%M %H %d %m\'`;
        chomp $auto_date;
        $ttl_date = $epg_date;
        $ttl_date =~ s/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/\1-\2-\3/;
        $epg_time = $epg_start;
        $epg_time =~ s/([0-9]{2}):([0-9]{2}):[0-9]{2}/\1\2/;
        $epg_sec = int(($epg_sec + 59)/60)*60;
        $rec_sec = sprintf("%05d", $rec_sec);
        if ($ch_name eq "BS9" && $epg_title !~ /\[無\]/) { next;}
        push @book, "$auto_date * cron_rec.pl $rec_ch $epg_sec \"$ttl_date $epg_time $ch_name ○$epg_title\" $epg_id";
} # foreach

open FH, ">$auto_file.tmp";
foreach (@book){print FH "$_\n";}
close FH;
@crontab = `nice -5 cat $auto_file.tmp | sort -k 9 | uniq`;
`nice -5 rm $auto_file.tmp`;

open FH, ">$auto_file";
print FH "$path\n";
print FH "$mailto\n";
print FH "$autobook\n";
foreach (@crontab){print FH "$_";}
close FH;

`nice -5 sort -u -k 1,8 $book_file $auto_file | sort -s   -k 9,10 > $merge_file`;
`nice -5 crontab -u $cron_user $merge_file`;

exit;

Friio関連エントリ検索

トラックバック

このエントリーのトラックバックURL:
http://www.okubo.tk/blog/mt-tb.cgi/7823

コメントを投稿

« ホームズくん史上最強の難問 | メイン | サイドバーほか再編 »

«  2010年08月  »

1234567
891011121314
15161718192021
22232425262728
293031

アーカイブ

2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
2002年
2001年
2000年
1978年
Total 3047 Entries.

カテゴリー

Powered by
Movable Type 3.2-ja-2

38.107.179.214

38.107.179.214