#!/usr/bin/perl # # Anime recording system foltia # http://www.dcc-jpl.com/soft/foltia/ # #xmltv2foltia.pl #XMLTV日本語版の出力するXMLを受け取り、EPGデータベースに挿入します。 # #↓本家に取り込まれたっぽい(未確認) # #XMLTVは # http://www.systemcreate-inc.com/gsxr/pc/mythtv.html#patches #のパッチをあてたものを想定しています。オリジナルと比較して、サブタイトルや内容など #より詳細な内容を取得できます。 # # usage;perl /usr/bin/tv_grab_jp | ./xmltv2foltia.pl # # # DCC-JPL Japan/foltia project # # use LWP::Simple; #use Encode qw(from_to); #use encoding 'euc-jp', STDIN=>'utf8', STDOUT=>'euc-jp' ; # 標準入力:utf8 # http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html use Jcode; # use Data::Dumper; use Time::Local; use DBI; use DBD::Pg; use DBD::SQLite; $path = $0; $path =~ s/xmltv2foltia.pl$//i; if ($path ne "./"){ push( @INC, "$path"); } require "foltialib.pl"; $currentworkdate = "" ; $currentworkch = "" ; $today = strftime("%Y%m%d", localtime); $todaytime = strftime("%Y%m%d%H%M", localtime); # DB Connect $dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;; $dbh->{AutoCommit} = 0; while(<>){ #print $_; Jcode::convert(\$_,'euc','utf8'); # from_to($_, "utf8","euc-jp"); if(/ # NHK総合 # NHK # s/^[\s]*//gio; s//\" /i; s/\"\>/\" /i; s/\"[\s]/\";\n/gio; s/[\w]*=/\$channel{$&}=/gio; s/\=}=/}=/gio; chomp(); eval("$_"); #print Dumper($_) ; }elsif(//){ # foltia 局リストに載ってない放送局は追加しない # print "$channel{id} #$channel{ja} #$channel{en} #-------------------------------\n"; $channel{id} = ""; $channel{ja} = ""; $channel{en} = ""; }elsif (/ # 土曜ワイド劇場 # 「救命士・牧田さおり緊急出動!毒劇物災害の現場になぜ刺殺体?意識不明の患者と少年に謎の接点」 # 寺田敏雄脚本 岡本弘監督 浅野温子 宇崎竜童 遠藤憲一 細川ふみえ 石丸謙二郎 根岸季衣  そのまんま東 # ドラマ # series # s//\" /i; s/\"\>/\" /i; s/\"[\s]/\";\n/gio; s/[\w]*=/\$item{$&}=/gio; s/\=}=/}=/gio; chomp(); eval("$_"); #print Dumper($_) ; #print "$item{start}/$item{stop}/$item{channel}\n"; }elsif(//){ #登録処理はココで #&writelog("xmltv2foltia DEBUG call chkerase $item{'start'},$item{'channel'}"); &chkerase($item{'start'}, $item{'channel'}); if ($item{'subtitle'} ne "" ){ $registdesc = $item{'subtitle'}." ".$item{'desc'}; }else{ $registdesc = $item{'desc'}; } ®istdb($item{'start'},$item{'stop'},$item{'channel'},$item{'title'},$registdesc ,$item{'category'}); # print "$item{start} #$item{stop} #$item{channel} #$item{title} #$item{desc} #$item{category} # -------------------------------\n"; $item{start} = ""; $item{stop} = ""; $item{channel} = ""; $item{title} = ""; $item{subtitle} = ""; $item{desc} = ""; $item{category} = ""; $registdesc = ""; }# endif }# while $dbh->commit; #end ################ sub chkerase{ # xmltvからきた日付とチャンネルをfoltia epgと比較 my $foltiastarttime = $_[0]; # 14桁 my $ontvepgchannel = $_[1]; my $epgstartdate = substr($foltiastarttime,0,8); # 8桁 20050807 my @epgcounts = ""; my $DBQuery = ""; #if ($currentworkdate eq "" ){#初回起動なら if ( $currentworkch ne $ontvepgchannel){ if ($epgstartdate >= $today){# xmltvtvから今日以降のデータが来ていれば my $epgstartdatetime = $today * 10000 ; # 200508070000 12桁 # 新規に入る予定の未来の番組表、全部いったん消す # $DBQuery = "DELETE from foltia_epg where startdatetime > $epgstartdatetime AND ontvchannel = '$ontvepgchannel' "; $sth = $dbh->prepare($stmt{'xmltv2foltia.chkerase.1'}); $sth->execute($todaytime, $ontvepgchannel); &writelog("xmltv2foltia DELETE EPG $epgstartdatetime:$stmt{'xmltv2foltia.chkerase.1'}"); #$currentworkdate = "$today"; $currentworkch = $ontvepgchannel ; }else{ &writelog("xmltv2foltia ERROR EPG INVALID:$epgstartdate:$today"); #exit(); }# endif xmltvtvから今日のデータが来ていれば }#end if 初回起動なら } sub registdb{ my $foltiastarttime = $_[0]; my $foltiaendtime = $_[1]; my $channel = $_[2]; my $title = $_[3]; my $desc = $_[4]; my $category = $_[5]; #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime"); $foltiastarttime = substr($foltiastarttime,0,12); $foltiaendtime = substr($foltiaendtime,0,12); if($foltiastarttime > $todaytime){ $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'}); $sth->execute(); @currentepgid = $sth->fetchrow_array; if ($currentepgid[0] < 1 ){ $newepgid = 1; }else{ $newepgid = $currentepgid[0]; $newepgid++; } #&writelog("xmltv2foltia DEBUG $currentepgid[0] / $newepgid"); my $lengthmin = &calclength($foltiastarttime , $foltiaendtime); # $newepgid = $dbh->quote($newepgid ); # $foltiastarttime = $dbh->quote($foltiastarttime); # $foltiaendtime = $dbh->quote($foltiaendtime ); # $lengthmin = $dbh->quote($lengthmin ); # $channel = $dbh->quote($channel ); # $title = $dbh->quote($title); # $desc = $dbh->quote($desc); # $category = $dbh->quote($category); $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'}); $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n"; # &writelog("xmltv2foltia DEBUG $DBQuery"); }else{ #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime"); }#未来じゃなければ挿入しない } sub removetag(){ my $str = $_[0]; # HTMLタグの正規表現 $tag_regex my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}} my $comment_tag_regex = '-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)'; my $tag_regex = qq{$comment_tag_regex|<$tag_regex_}; my $text_regex = q{[^<]*}; my $result = ''; while ($str =~ /($text_regex)($tag_regex)?/gso) { last if $1 eq '' and $2 eq ''; $result .= $1; $tag_tmp = $2; if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) { $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi; ($text_tmp = $1) =~ s//>/g; $result .= $text_tmp; } } return $result ; } # end sub removetag