root/trunk/install/perl/xmltv2foltia.pl

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

WOWOWで<title lang="ja_JP">【無】</title>こんな番組名のEPGのとき、番組名が空白になってしまう問題を修正

  • 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         $titlebackup = $item{title};
130         $item{title} =~ s/【.*?】//g;#【解】とか
131         $item{title} =~ s/\[.*?\]//g;#[二]とか
132 #       $item{title} =~ s/【.??】//g;#【解】とか
133 #       $item{title} =~ s/\[.??\]//g;#[二]とか
134         if ($item{title} eq ""){
135                 # WOWOWで<title lang="ja_JP">【無】</title>こんなミニ番組があり、タイトル空白になってしまうことがある
136                 $item{title} = $titlebackup;
137         }
138         #print Dumper($_) ;
139         #print "$result  \n";
140
141 }elsif(/<desc /){
142         s/^[\s]*//gio;
143         chomp();
144         $item{desc}  = &removetag($_);
145         #print Dumper($_) ;
146         #print "$result  \n";
147
148 }elsif(/<category lang=\"ja_JP/){
149         s/^[\s]*//gio;
150         chomp();
151         $item{category} = &removetag($_);
152        
153         if ($item{category} =~ /情報/){
154         $item{category} = "information";
155         }elsif ($item{category} =~ /趣味・実用/){
156         $item{category} = "hobby";
157         }elsif ($item{category} =~ /教育/){
158         $item{category} = "education";
159         }elsif ($item{category} =~ /音楽/){
160         $item{category} = "music";
161         }elsif ($item{category} =~ /演劇/){
162         $item{category} = "stage";
163         }elsif ($item{category} =~ /映画/){
164         $item{category} = "cinema";
165         }elsif ($item{category} =~ /バラエティ/){
166         $item{category} = "variety";
167         }elsif ($item{category} =~ /ニュース・報道/){
168         $item{category} = "news";
169         }elsif ($item{category} =~ /ドラマ/){
170         $item{category} = "drama";
171         }elsif ($item{category} =~ /ドキュメンタリー・教養/){
172         $item{category} = "documentary";
173         }elsif ($item{category} =~ /スポーツ/){
174         $item{category} = "sports";
175         }elsif ($item{category} =~ /キッズ/){
176         $item{category} = "kids";
177         }elsif ($item{category} =~ /アニメ・特撮/){
178         $item{category} = "anime";
179         }elsif ($item{category} =~ /その他/){
180         $item{category} = "etc";
181         }else{
182         $item{category} = "etc";
183         }
184        
185         #print Dumper($_) ;
186         #print "$result  \n";
187
188
189 }elsif(/<\/programme>/){
190 #登録処理はココで
191 #&writelog("xmltv2foltia DEBUG call chkerase $item{'start'},$item{'channel'}");
192 #旧仕様    #&chkerase($item{'start'}, $item{'channel'});
193         &replaceepg($item{'start'}, $item{'channel'},$item{'stop'});
194         if ($item{'subtitle'} ne "" ){
195             $registdesc = $item{'subtitle'}." ".$item{'desc'};
196 }else{
197             $registdesc = $item{'desc'};
198 }
199         &registdb($item{'start'},$item{'stop'},$item{'channel'},$item{'title'},$registdesc ,$item{'category'});
200
201 #       print "$item{start}
202 #$item{stop}
203 #$item{channel}
204 #$item{title}
205 #$item{desc}
206 #$item{category}
207 # -------------------------------\n";
208
209         $item{start} = "";
210         $item{stop} = "";
211         $item{channel} = "";
212         $item{title} = "";
213         $item{subtitle} = "";
214         $item{desc} = "";
215         $item{category} = "";
216         $registdesc = "";
217 }# endif
218 }# while
219 &commitdb;
220
221
222 #end
223 ################
224
225 sub replaceepg{
226 #消すEPGのIDを配列に追加します
227 my $foltiastarttime = $_[0]; # 14桁
228 my $ontvepgchannel =  $_[1];
229 my $foltiaendtime = $_[2]; # 14桁
230 my @data = ();
231
232 $foltiastarttime = substr($foltiastarttime,0,12); # 12桁 200508072254
233 $foltiaendtime   = substr($foltiaendtime,0,12); # 12桁 200508072355
234
235 $sth = $dbh->prepare($stmt{'xmltv2foltia.replaceepg.1'});
236 my $now = &epoch2foldate(time());
237 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
238 while (@data = $sth->fetchrow_array()) {
239         push(@deleteepgid,$data[0]);
240         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
241 }#end while
242
243 #上書きを消す
244 $sth = $dbh->prepare($stmt{'xmltv2foltia.replaceepg.2'});
245 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
246 while (@data = $sth->fetchrow_array()) {
247         push(@deleteepgid,$data[0]);
248         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
249 }#end while
250
251 }#endsub replaceepg
252
253 sub registdb{
254 my $foltiastarttime = $_[0];
255 my $foltiaendtime = $_[1];
256 my $channel = $_[2];
257 my $title = $_[3];
258 my $desc = $_[4];
259 my $category = $_[5];
260
261 #Encode::JP::H2Z::z2h(\$string);
262 $title = jcode($title)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|} ','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|} ');
263 $desc = jcode($desc)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|} ','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|} ');
264 #$title = jcode($title)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
265 #$desc = jcode($desc)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
266
267 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
268 $foltiastarttime = substr($foltiastarttime,0,12);
269 $foltiaendtime = substr($foltiaendtime,0,12);
270
271 #if($foltiaendtime > $todaytime){#電波に乗ってきた情報は無条件更新
272 # epgidはAUTOINCREMENTに変更した #2010/8/10
273 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'});
274 #               $sth->execute();
275 #        @currentepgid = $sth->fetchrow_array;
276 #       
277 #       if ($currentepgid[0] < 1 ){
278 #               $newepgid = 1;
279 #       }else{
280 #               $newepgid = $currentepgid[0];
281 #               $newepgid++;
282 #       }
283 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
284 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
285
286 #print "xmltv2foltia DEBUG :INSERT INTO foltia_epg VALUES ($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category)\n";
287 push (@foltiastarttime,$foltiastarttime);
288 push (@foltiaendtime,$foltiaendtime);
289 push (@lengthmin,$lengthmin);
290 push (@channel,$channel);
291 push (@title,$title);
292 push (@desc,$desc);
293 push (@category,$category);
294 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'});
295 #       $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n";
296 # &writelog("xmltv2foltia DEBUG $DBQuery");
297 #}else{
298 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
299 #}#未来じゃなければ挿入しない
300
301 }#end sub registdb
302
303 sub commitdb{
304 $dbh->{AutoCommit} = 0;
305 #print Dumper(\@dbarray);
306 my $loopcount = @foltiastarttime;
307 my $i = 0;
308
309 #削除
310 foreach $delid (@deleteepgid){
311         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.1'});
312         $sth->execute( $delid ) || warn "$delid\n";
313         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.1'}/$delid");
314 }
315 #追加
316 for ($i=0;$i<$loopcount;$i++){
317         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.2'});
318         $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";
319         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.2'}/$foltiastarttime[$i],$foltiaendtime[$i], $lengthmin[$i], $channel[$i], $title[$i], $desc[$i], $category[$i]");
320 }# end for
321 $dbh->commit;
322 $dbh->{AutoCommit} = 1;
323 }#end sub commitdb
324
325 sub removetag(){
326 my $str = $_[0];
327
328 # HTMLタグの正規表現 $tag_regex
329 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
330 my $comment_tag_regex =
331     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
332 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
333
334
335 my    $text_regex = q{[^<]*};
336
337  my   $result = '';
338     while ($str =~ /($text_regex)($tag_regex)?/gso) {
339       last if $1 eq '' and $2 eq '';
340       $result .= $1;
341       $tag_tmp = $2;
342       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
343         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
344         ($text_tmp = $1) =~ s/</&lt;/g;
345         $text_tmp =~ s/>/&gt;/g;
346         $result .= $text_tmp;
347       }
348     }
349
350
351 return $result ;
352
353 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed