root/trunk/install/perl/xmltv2foltia.pl

リビジョン 130, 9.8 kB (コミッタ: sorshi, コミット時期: 14 年 前)

野球などで番組延長時に延長番組の古いデータを消してなかった不具合を修正

  • svn:executable 属性の設定値:
Line 
1 #!/usr/bin/perl
2 #
3 # Anime recording system foltia
4 # http://www.dcc-jpl.com/soft/foltia/
5 #
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
13 #
14 # DCC-JPL Japan/foltia project
15 #
16 #
17
18 #use LWP::Simple;
19 #use Encode qw(from_to);
20 #use encoding 'euc-jp', STDIN=>'utf8', STDOUT=>'euc-jp' ; # 標準入力:utf8
21 # http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
22 use Jcode;
23 #use Data::Dumper;
24 use Time::Local;
25 use DBI;
26 use DBD::Pg;
27 use DBD::SQLite;
28
29 $path = $0;
30 $path =~ s/xmltv2foltia.pl$//i;
31 if ($path ne "./"){
32 push( @INC, "$path");
33 }
34 require "foltialib.pl";
35
36 $currentworkdate = "" ;
37 $currentworkch = "" ;
38 $today = strftime("%Y%m%d", localtime);
39 $todaytime = strftime("%Y%m%d%H%M", localtime);
40 @deleteepgid = ();
41
42 # DB Connect
43 $dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;;
44
45 while(<>){
46 #print $_;
47 s/\xef\xbd\x9e/\xe3\x80\x9c/g; #wavedash
48 s/\xef\xbc\x8d/\xe2\x88\x92/g; #hyphenminus
49 s/&#([0-9A-Fa-f]{2,6});/(chr($1))/eg; #'遊戯王5D&#039;s'とかの数値参照対応を
50
51 Jcode::convert(\$_,'euc','utf8');
52 #    from_to($_, "utf8","euc-jp");
53 if(/<channel/){
54
55 #  <channel id="0031.ontvjapan.com">
56 #    <display-name lang="ja_JP">NHK総合</display-name>
57 #    <display-name lang="en">NHK</display-name>
58 #  </channel>
59
60         s/^[\s]*//gio;
61         s/<channel//i;
62         #s/\"\/>/\" /i;
63         s/\"\>/\" /i;
64         s/\"[\s]/\";\n/gio;
65         s/[\w]*=/\$channel{$&}=/gio;
66         s/\=}=/}=/gio;
67         chomp();
68         eval("$_");
69 #print Dumper($_) ;
70
71 }elsif(/<display-name lang=\"ja_JP/){
72         s/^[\s]*//gio;
73         chomp();
74         $channel{ja}  = &removetag($_);
75         #print Dumper($_) ;
76         #print "$result  \n";
77 }elsif(/<display-name lang=\"en/){
78         s/^[\s]*//gio;
79         chomp();
80         $channel{en}  = &removetag($_);
81         #print Dumper($_) ;
82         #print "$result  \n";
83
84 }elsif(/<\/channel>/){
85 # foltia 局リストに載ってない放送局は追加しない
86
87 #       print "$channel{id}
88 #$channel{ja}
89 #$channel{en}
90 #-------------------------------\n";
91
92         $channel{id} = "";
93         $channel{ja} = "";
94         $channel{en} = "";
95
96 }elsif (/<programme /){
97
98 # <programme start="20051112210000 +0900" stop="20051112225100 +0900" channel="0007.ontvjapan.com">
99 #    <title lang="ja_JP">土曜ワイド劇場</title>
100 #    <sub-title lang="ja_JP">「救命士・牧田さおり緊急出動!毒劇物災害の現場になぜ刺殺体?意識不明の患者と少年に謎の接点」</sub-title>
101 #    <desc lang="ja_JP">寺田敏雄脚本 岡本弘監督 浅野温子 宇崎竜童 遠藤憲一 細川ふみえ 石丸謙二郎 根岸季衣  そのまんま東</desc>
102 #    <category lang="ja_JP">ドラマ</category>
103 #    <category lang="en">series</category>
104 #  </programme>
105
106         s/<programme //i;
107         #s/\"\/>/\" /i;
108         s/\"\>/\" /i;
109         s/\"[\s]/\";\n/gio;
110         s/[\w]*=/\$item{$&}=/gio;
111         s/\=}=/}=/gio;
112         chomp();
113         eval("$_");
114         #print Dumper($_) ;
115         #print "$item{start}/$item{stop}/$item{channel}\n";
116         
117
118 }elsif(/<sub-title /){
119         s/^[\s]*//gio;
120         chomp();
121         $item{subtitle}  = &removetag($_);
122         #print Dumper($_) ;
123         #print "$result  \n";
124
125 }elsif(/<title /){
126         s/^[\s]*//gio;
127         chomp();
128         $item{title}  = &removetag($_);
129         $item{title} =~ s/【.*?】//g;#【解】とか
130         $item{title} =~ s/\[.*?\]//g;#[二]とか
131         #print Dumper($_) ;
132         #print "$result  \n";
133
134 }elsif(/<desc /){
135         s/^[\s]*//gio;
136         chomp();
137         $item{desc}  = &removetag($_);
138         #print Dumper($_) ;
139         #print "$result  \n";
140
141 }elsif(/<category lang=\"ja_JP/){
142         s/^[\s]*//gio;
143         chomp();
144         $item{category} = &removetag($_);
145        
146         if ($item{category} =~ /情報/){
147         $item{category} = "information";
148         }elsif ($item{category} =~ /趣味・実用/){
149         $item{category} = "hobby";
150         }elsif ($item{category} =~ /教育/){
151         $item{category} = "education";
152         }elsif ($item{category} =~ /音楽/){
153         $item{category} = "music";
154         }elsif ($item{category} =~ /演劇/){
155         $item{category} = "stage";
156         }elsif ($item{category} =~ /映画/){
157         $item{category} = "cinema";
158         }elsif ($item{category} =~ /バラエティ/){
159         $item{category} = "variety";
160         }elsif ($item{category} =~ /ニュース・報道/){
161         $item{category} = "news";
162         }elsif ($item{category} =~ /ドラマ/){
163         $item{category} = "drama";
164         }elsif ($item{category} =~ /ドキュメンタリー・教養/){
165         $item{category} = "documentary";
166         }elsif ($item{category} =~ /スポーツ/){
167         $item{category} = "sports";
168         }elsif ($item{category} =~ /キッズ/){
169         $item{category} = "kids";
170         }elsif ($item{category} =~ /アニメ・特撮/){
171         $item{category} = "anime";
172         }elsif ($item{category} =~ /その他/){
173         $item{category} = "etc";
174         }
175        
176         #print Dumper($_) ;
177         #print "$result  \n";
178
179
180 }elsif(/<\/programme>/){
181 #登録処理はココで
182 #&writelog("xmltv2foltia DEBUG call chkerase $item{'start'},$item{'channel'}");
183 #旧仕様    #&chkerase($item{'start'}, $item{'channel'});
184         &replaceepg($item{'start'}, $item{'channel'},$item{'stop'});
185         if ($item{'subtitle'} ne "" ){
186             $registdesc = $item{'subtitle'}." ".$item{'desc'};
187 }else{
188             $registdesc = $item{'desc'};
189 }
190         &registdb($item{'start'},$item{'stop'},$item{'channel'},$item{'title'},$registdesc ,$item{'category'});
191
192 #       print "$item{start}
193 #$item{stop}
194 #$item{channel}
195 #$item{title}
196 #$item{desc}
197 #$item{category}
198 # -------------------------------\n";
199
200         $item{start} = "";
201         $item{stop} = "";
202         $item{channel} = "";
203         $item{title} = "";
204         $item{subtitle} = "";
205         $item{desc} = "";
206         $item{category} = "";
207         $registdesc = "";
208 }# endif
209 }# while
210 &commitdb;
211
212
213 #end
214 ################
215
216 sub replaceepg{
217 #消すEPGのIDを配列に追加します
218 my $foltiastarttime = $_[0]; # 14桁
219 my $ontvepgchannel =  $_[1];
220 my $foltiaendtime = $_[2]; # 14桁
221 my @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 = $dbh->prepare("SELECT * FROM foltia_epg WHERE enddatetime > ? AND startdatetime < ? AND ontvchannel = ?");
228
229 my $now = &epoch2foldate(time());
230 #$sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel,$now);
231 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
232 while (@data = $sth->fetchrow_array()) {
233         push(@deleteepgid,$data[0]);
234         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
235 }#end while
236
237 #上書きを消す
238 $sth = $dbh->prepare($stmt{'xmltv2foltia.replaceepg.2'});
239 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
240 while (@data = $sth->fetchrow_array()) {
241         push(@deleteepgid,$data[0]);
242         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
243 }#end while
244
245 }#endsub replaceepg
246
247 sub registdb{
248 my $foltiastarttime = $_[0];
249 my $foltiaendtime = $_[1];
250 my $channel = $_[2];
251 my $title = $_[3];
252 my $desc = $_[4];
253 my $category = $_[5];
254
255 #Encode::JP::H2Z::z2h(\$string);
256 $title = jcode($title)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
257 $desc = jcode($desc)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
258
259 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
260 $foltiastarttime = substr($foltiastarttime,0,12);
261 $foltiaendtime = substr($foltiaendtime,0,12);
262
263 #if($foltiaendtime > $todaytime){#電波に乗ってきた情報は無条件更新
264 # epgidはAUTOINCREMENTに変更した #2010/8/10
265 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'});
266 #               $sth->execute();
267 #        @currentepgid = $sth->fetchrow_array;
268 #       
269 #       if ($currentepgid[0] < 1 ){
270 #               $newepgid = 1;
271 #       }else{
272 #               $newepgid = $currentepgid[0];
273 #               $newepgid++;
274 #       }
275 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
276 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
277
278 #print "xmltv2foltia DEBUG :INSERT INTO foltia_epg VALUES ($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category)\n";
279 push (@foltiastarttime,$foltiastarttime);
280 push (@foltiaendtime,$foltiaendtime);
281 push (@lengthmin,$lengthmin);
282 push (@channel,$channel);
283 push (@title,$title);
284 push (@desc,$desc);
285 push (@category,$category);
286 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'});
287 #       $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n";
288 # &writelog("xmltv2foltia DEBUG $DBQuery");
289 #}else{
290 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
291 #}#未来じゃなければ挿入しない
292
293 }#end sub registdb
294
295 sub commitdb{
296 $dbh->{AutoCommit} = 0;
297 #print Dumper(\@dbarray);
298 my $loopcount = @foltiastarttime;
299 my $i = 0;
300
301 #削除
302 foreach $delid (@deleteepgid){
303         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.1'});
304         $sth->execute( $delid ) || warn "$delid\n";
305         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.1'}/$delid");
306 }
307 #追加
308 for ($i=0;$i<$loopcount;$i++){
309         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.2'});
310         $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";
311         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.2'}/$foltiastarttime[$i],$foltiaendtime[$i], $lengthmin[$i], $channel[$i], $title[$i], $desc[$i], $category[$i]");
312 }# end for
313 $dbh->commit;
314 $dbh->{AutoCommit} = 1;
315 }#end sub commitdb
316
317 sub removetag(){
318 my $str = $_[0];
319
320 # HTMLタグの正規表現 $tag_regex
321 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
322 my $comment_tag_regex =
323     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
324 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
325
326
327 my    $text_regex = q{[^<]*};
328
329  my   $result = '';
330     while ($str =~ /($text_regex)($tag_regex)?/gso) {
331       last if $1 eq '' and $2 eq '';
332       $result .= $1;
333       $tag_tmp = $2;
334       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
335         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
336         ($text_tmp = $1) =~ s/</&lt;/g;
337         $text_tmp =~ s/>/&gt;/g;
338         $result .= $text_tmp;
339       }
340     }
341
342
343 return $result ;
344
345 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed