root/trunk/install/perl/xmltv2foltia.pl

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

チェンジセット130での更新がSQL直書きだったのを修正

  • 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 my $now = &epoch2foldate(time());
228 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
229 while (@data = $sth->fetchrow_array()) {
230         push(@deleteepgid,$data[0]);
231         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
232 }#end while
233
234 #上書きを消す
235 $sth = $dbh->prepare($stmt{'xmltv2foltia.replaceepg.2'});
236 $sth->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
237 while (@data = $sth->fetchrow_array()) {
238         push(@deleteepgid,$data[0]);
239         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
240 }#end while
241
242 }#endsub replaceepg
243
244 sub registdb{
245 my $foltiastarttime = $_[0];
246 my $foltiaendtime = $_[1];
247 my $channel = $_[2];
248 my $title = $_[3];
249 my $desc = $_[4];
250 my $category = $_[5];
251
252 #Encode::JP::H2Z::z2h(\$string);
253 $title = jcode($title)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
254 $desc = jcode($desc)->tr('A-Za-z0-9!#$%&()*+,−./:;<=>?@[\]^_`{|}','A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}');
255
256 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
257 $foltiastarttime = substr($foltiastarttime,0,12);
258 $foltiaendtime = substr($foltiaendtime,0,12);
259
260 #if($foltiaendtime > $todaytime){#電波に乗ってきた情報は無条件更新
261 # epgidはAUTOINCREMENTに変更した #2010/8/10
262 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.1'});
263 #               $sth->execute();
264 #        @currentepgid = $sth->fetchrow_array;
265 #       
266 #       if ($currentepgid[0] < 1 ){
267 #               $newepgid = 1;
268 #       }else{
269 #               $newepgid = $currentepgid[0];
270 #               $newepgid++;
271 #       }
272 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
273 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
274
275 #print "xmltv2foltia DEBUG :INSERT INTO foltia_epg VALUES ($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category)\n";
276 push (@foltiastarttime,$foltiastarttime);
277 push (@foltiaendtime,$foltiaendtime);
278 push (@lengthmin,$lengthmin);
279 push (@channel,$channel);
280 push (@title,$title);
281 push (@desc,$desc);
282 push (@category,$category);
283 #       $sth = $dbh->prepare($stmt{'xmltv2foltia.registdb.2'});
284 #       $sth->execute($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category) || warn "error: $newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category\n";
285 # &writelog("xmltv2foltia DEBUG $DBQuery");
286 #}else{
287 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
288 #}#未来じゃなければ挿入しない
289
290 }#end sub registdb
291
292 sub commitdb{
293 $dbh->{AutoCommit} = 0;
294 #print Dumper(\@dbarray);
295 my $loopcount = @foltiastarttime;
296 my $i = 0;
297
298 #削除
299 foreach $delid (@deleteepgid){
300         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.1'});
301         $sth->execute( $delid ) || warn "$delid\n";
302         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.1'}/$delid");
303 }
304 #追加
305 for ($i=0;$i<$loopcount;$i++){
306         $sth = $dbh->prepare($stmt{'xmltv2foltia.commitdb.2'});
307         $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";
308         #&writelog("xmltv2foltia DEBUG $stmt{'xmltv2foltia.commitdb.2'}/$foltiastarttime[$i],$foltiaendtime[$i], $lengthmin[$i], $channel[$i], $title[$i], $desc[$i], $category[$i]");
309 }# end for
310 $dbh->commit;
311 $dbh->{AutoCommit} = 1;
312 }#end sub commitdb
313
314 sub removetag(){
315 my $str = $_[0];
316
317 # HTMLタグの正規表現 $tag_regex
318 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
319 my $comment_tag_regex =
320     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
321 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
322
323
324 my    $text_regex = q{[^<]*};
325
326  my   $result = '';
327     while ($str =~ /($text_regex)($tag_regex)?/gso) {
328       last if $1 eq '' and $2 eq '';
329       $result .= $1;
330       $tag_tmp = $2;
331       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
332         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
333         ($text_tmp = $1) =~ s/</&lt;/g;
334         $text_tmp =~ s/>/&gt;/g;
335         $result .= $text_tmp;
336       }
337     }
338
339
340 return $result ;
341
342 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed