差分発生行の前後
無視リスト:
コミット日時:
2010/08/17 01:12:56 (14 年前)
コミッタ:
sorshi
ログメッセージ:

・放送波からのEPG番組表取得に対応。
・foltia_epgテーブル構成変更
・folcast.phpがSQLiteでまったく動作していなかったのを修正

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/install/perl/xmltv2foltia.pl

    r94 r111  
    44# http://www.dcc-jpl.com/soft/foltia/ 
    55# 
    6 #xmltv2foltia.pl  
    7 #XMLTV日本語版の出力するXMLを受け取り、EPGデータベースに挿入します。 
    8 
    9 #↓本家に取り込まれたっぽい(未確認) 
    10 
    11 #XMLTVは 
    12 # http://www.systemcreate-inc.com/gsxr/pc/mythtv.html#patches 
    13 #のパッチをあてたものを想定しています。オリジナルと比較して、サブタイトルや内容など 
    14 #より詳細な内容を取得できます。 
    15 
    16 # usage;perl  /usr/bin/tv_grab_jp | ./xmltv2foltia.pl  
    17 
     6# xmltv2foltia.pl  
     7
     8# XMLTV日本語版形式のXMLを受け取り、EPGデータベースに挿入します。 
     9# アナログ時代はXMLTVを利用していましたが、現在はepgimport.plを使用します。 
     10
     11# usage 
     12# cat /tmp/__27-epg.xml | /home/foltia/perl/xmltv2foltia.pl 
    1813# 
    1914# DCC-JPL Japan/foltia project 
     
    2621# http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html 
    2722use Jcode; 
    28 # use Data::Dumper;  
     23use Data::Dumper;  
    2924use Time::Local; 
    3025use DBI; 
     
    4338$today = strftime("%Y%m%d", localtime); 
    4439$todaytime = strftime("%Y%m%d%H%M", localtime); 
     40@deleteepgid = (); 
    4541 
    4642# DB Connect 
    4743$dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;; 
    48 $dbh->{AutoCommit} = 0; 
    4944 
    5045while(<>){ 
    5146#print $_; 
     47s/\xef\xbd\x9e/\xe3\x80\x9c/g; #wavedash 
     48s/\xef\xbc\x8d/\xe2\x88\x92/g; #hyphenminus 
     49s/&#([0-9A-Fa-f]{2,6});/(chr($1))/eg; #'遊戯王5D&#039;s'とかの数値参照対応を 
     50 
    5251Jcode::convert(\$_,'euc','utf8'); 
    5352#    from_to($_, "utf8","euc-jp"); 
     
    6968        eval("$_"); 
    7069#print Dumper($_) ; 
    71  
    72 }elsif(/<display-name lang=\"ja_JP/){ 
    73         s/^[\s]*//gio; 
    74         chomp(); 
    75         $channel{ja}  = &removetag($_); 
    76         #print Dumper($_) ; 
    77         #print "$result  \n"; 
    78  
    7970 
    8071}elsif(/<display-name lang=\"ja_JP/){ 
     
    136127        chomp(); 
    137128        $item{title}  = &removetag($_); 
     129        $item{title} =~ s/【.*】//g;#【解】とか 
     130        $item{title} =~ s/\[.*\]//g;#[二]とか  
    138131        #print Dumper($_) ; 
    139132        #print "$result  \n"; 
     
    188181#登録処理はココで 
    189182#&writelog("xmltv2foltia DEBUG call chkerase $item{'start'},$item{'channel'}"); 
    190  
    191         &chkerase($item{'start'}, $item{'channel'}); 
     183#旧仕様    #&chkerase($item{'start'}, $item{'channel'}); 
     184        &replaceepg($item{'start'}, $item{'channel'},$item{'stop'}); 
    192185        if ($item{'subtitle'} ne "" ){ 
    193186            $registdesc = $item{'subtitle'}." ".$item{'desc'}; 
     
    215208}# endif 
    216209}# while 
    217  
    218 $dbh->commit; 
     210&commitdb; 
     211 
    219212 
    220213#end 
    221214################ 
    222215 
    223 sub chkerase
    224 # xmltvからきた日付とチャンネルをfoltia epgと比較 
     216sub replaceepg
     217#消すEPGのIDを配列に追加します 
    225218my $foltiastarttime = $_[0]; # 14桁 
    226219my $ontvepgchannel =  $_[1]; 
    227 my $epgstartdate = substr($foltiastarttime,0,8); # 8桁 20050807 
    228 my  @epgcounts = ""; 
    229 my $DBQuery = ""; 
    230  
    231 #if ($currentworkdate eq "" ){#初回起動なら 
    232 if ( $currentworkch ne $ontvepgchannel){ 
    233  
    234  
    235 if ($epgstartdate >= $today){# xmltvtvから今日以降のデータが来ていれば 
    236 my $epgstartdatetime = $today * 10000 ; # 200508070000 12桁 
    237 # 新規に入る予定の未来の番組表、全部いったん消す 
    238 # $DBQuery =  "DELETE from foltia_epg where startdatetime > $epgstartdatetime AND ontvchannel = '$ontvepgchannel' "; 
    239             $sth = $dbh->prepare($stmt{'xmltv2foltia.chkerase.1'}); 
    240             $sth->execute($todaytime, $ontvepgchannel); 
    241             &writelog("xmltv2foltia DELETE EPG $epgstartdatetime:$stmt{'xmltv2foltia.chkerase.1'}"); 
    242 #$currentworkdate = "$today"; 
    243 $currentworkch = $ontvepgchannel ; 
    244 }else{ 
    245         &writelog("xmltv2foltia ERROR EPG INVALID:$epgstartdate:$today"); 
    246         #exit(); 
    247 }# endif xmltvtvから今日のデータが来ていれば 
    248 }#end if 初回起動なら 
    249  
    250 
     220my $foltiaendtime = $_[2]; # 14桁 
     221my @data = (); 
     222 
     223$foltiastarttime = substr($foltiastarttime,0,12); # 12桁 200508072254 
     224$foltiaendtime   = substr($foltiaendtime,0,12); # 12桁 200508072355 
     225 
     226$sth = $dbh->prepare($stmt{'xmltv2foltia.replaceepg.1'}); 
     227$sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel); 
     228 
     229while (@data = $sth->fetchrow_array()) { 
     230        push(@deleteepgid,$data[0]); 
     231        #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);"); 
     232}#end while  
     233}#endsub replaceepg 
     234 
    251235sub registdb{ 
    252236my $foltiastarttime = $_[0]; 
     
    258242 
    259243#&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime"); 
    260  
    261   
    262244$foltiastarttime = substr($foltiastarttime,0,12); 
    263245$foltiaendtime = substr($foltiaendtime,0,12); 
    264246 
    265 if($foltiastarttime > $todaytime){ 
    266          
    267       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'}); 
    268               $sth->execute(); 
    269        @currentepgid = $sth->fetchrow_array; 
    270         
    271       if ($currentepgid[0] < 1 ){ 
    272               $newepgid = 1; 
    273       }else{ 
    274               $newepgid = $currentepgid[0];  
    275               $newepgid++;  
    276       } 
     247if($foltiaendtime > $todaytime){ 
     248# epgidはAUTOINCREMENTに変更した #2010/8/10  
     249#     $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'}); 
     250#             $sth->execute(); 
     251#      @currentepgid = $sth->fetchrow_array; 
     252#       
     253#     if ($currentepgid[0] < 1 ){ 
     254#             $newepgid = 1; 
     255#     }else{ 
     256#             $newepgid = $currentepgid[0];  
     257#             $newepgid++;  
     258#     } 
    277259#&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid"); 
    278260my $lengthmin = &calclength($foltiastarttime , $foltiaendtime); 
    279 #       $newepgid = $dbh->quote($newepgid ); 
    280 #       $foltiastarttime = $dbh->quote($foltiastarttime); 
    281 #       $foltiaendtime = $dbh->quote($foltiaendtime ); 
    282 #       $lengthmin = $dbh->quote($lengthmin ); 
    283 #       $channel = $dbh->quote($channel ); 
    284 #       $title = $dbh->quote($title); 
    285 #       $desc = $dbh->quote($desc); 
    286 #       $category = $dbh->quote($category); 
    287  
    288         $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'}); 
    289         $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || 
    290             warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n"; 
    291  
     261 
     262#print "xmltv2foltia DEBUG :INSERT INTO foltia_epg VALUES ($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category)\n"; 
     263push (@foltiastarttime,$foltiastarttime); 
     264push (@foltiaendtime,$foltiaendtime);  
     265push (@lengthmin,$lengthmin);  
     266push (@channel,$channel);  
     267push (@title,$title);  
     268push (@desc,$desc); 
     269push (@category,$category); 
     270#       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'}); 
     271#       $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n"; 
    292272# &writelog("xmltv2foltia DEBUG $DBQuery"); 
    293  
    294273}else{ 
    295274#&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime"); 
    296275}#未来じゃなければ挿入しない 
    297276 
     277}#end sub registdb 
     278 
     279sub commitdb{ 
     280$dbh->{AutoCommit} = 0; 
     281$dbh->do('BEGIN'); 
     282#print Dumper(\@dbarray); 
     283my $loopcount = @foltiastarttime; 
     284my $i = 0; 
     285 
     286#削除 
     287foreach $delid (@deleteepgid){ 
     288        $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.1'}); 
     289        $sth->execute( $delid ) || warn "$delid\n"; 
     290#       &writelog("xmltv2foltia DEBUG : DELETE FROM foltia_epg WHERE epgid = $delid"); 
    298291} 
    299  
    300  
    301  
    302  
    303  
    304  
    305  
     292#追加 
     293for ($i=0;$i<$loopcount;$i++){ 
     294        $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.2'}); 
     295        $sth->execute( $foltiastarttime[$i],$foltiaendtime[$i], $lengthmin[$i], $channel[$i], $title[$i], $desc[$i], $category[$i]) || warn "error: $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n"; 
     296#&writelog("xmltv2foltia DEBUG : INSERT INTO foltia_epg VALUES ( NULL , $foltiastarttime[$i],$foltiaendtime[$i], $lengthmin[$i], $channel[$i], $title[$i], $desc[$i], $category[$i])"); 
     297}# end for 
     298$dbh->do('COMMIT'); 
     299$dbh->{AutoCommit} = 1; 
     300}#end sub commitdb 
    306301 
    307302sub removetag(){ 
track feed