root/trunk/install/perl/xmltv2foltia.pl

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

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

  • 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->execute($foltiastarttime , $foltiaendtime , $ontvepgchannel);
228
229 while (@data = $sth->fetchrow_array()) {
230         push(@deleteepgid,$data[0]);
231         #&writelog("xmltv2foltia DEBUG push(\@deleteepgid,$data[0]);");
232 }#end while
233 }#endsub replaceepg
234
235 sub registdb{
236 my $foltiastarttime = $_[0];
237 my $foltiaendtime = $_[1];
238 my $channel = $_[2];
239 my $title = $_[3];
240 my $desc = $_[4];
241 my $category = $_[5];
242
243 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
244 $foltiastarttime = substr($foltiastarttime,0,12);
245 $foltiaendtime = substr($foltiaendtime,0,12);
246
247 if($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 #       }
259 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
260 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
261
262 #print "xmltv2foltia DEBUG :INSERT INTO foltia_epg VALUES ($newepgid, $foltiastarttime, $foltiaendtime, $lengthmin, $channel, $title, $desc, $category)\n";
263 push (@foltiastarttime,$foltiastarttime);
264 push (@foltiaendtime,$foltiaendtime);
265 push (@lengthmin,$lengthmin);
266 push (@channel,$channel);
267 push (@title,$title);
268 push (@desc,$desc);
269 push (@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";
272 # &writelog("xmltv2foltia DEBUG $DBQuery");
273 }else{
274 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
275 }#未来じゃなければ挿入しない
276
277 }#end sub registdb
278
279 sub commitdb{
280 $dbh->{AutoCommit} = 0;
281 $dbh->do('BEGIN');
282 #print Dumper(\@dbarray);
283 my $loopcount = @foltiastarttime;
284 my $i = 0;
285
286 #削除
287 foreach $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");
291 }
292 #追加
293 for ($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
301
302 sub removetag(){
303 my $str = $_[0];
304
305 # HTMLタグの正規表現 $tag_regex
306 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
307 my $comment_tag_regex =
308     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
309 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
310
311
312 my    $text_regex = q{[^<]*};
313
314  my   $result = '';
315     while ($str =~ /($text_regex)($tag_regex)?/gso) {
316       last if $1 eq '' and $2 eq '';
317       $result .= $1;
318       $tag_tmp = $2;
319       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
320         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
321         ($text_tmp = $1) =~ s/</&lt;/g;
322         $text_tmp =~ s/>/&gt;/g;
323         $result .= $text_tmp;
324       }
325     }
326
327
328 return $result ;
329
330 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed