root/trunk/install/perl/xmltv2foltia.pl

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

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 #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 #
18 #
19 # DCC-JPL Japan/foltia project
20 #
21 #
22
23 use LWP::Simple;
24 #use Encode qw(from_to);
25 #use encoding 'euc-jp', STDIN=>'utf8', STDOUT=>'euc-jp' ; # 標準入力:utf8
26 # http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
27 use Jcode;
28 # use Data::Dumper;
29 use Time::Local;
30 use DBI;
31 use DBD::Pg;
32 use DBD::SQLite;
33
34 $path = $0;
35 $path =~ s/xmltv2foltia.pl$//i;
36 if ($path ne "./"){
37 push( @INC, "$path");
38 }
39 require "foltialib.pl";
40
41 $currentworkdate = "" ;
42 $currentworkch = "" ;
43 $today = strftime("%Y%m%d", localtime);
44 $todaytime = strftime("%Y%m%d%H%M", localtime);
45
46 # DB Connect
47 $dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;;
48 $dbh->{AutoCommit} = 0;
49
50 while(<>){
51 #print $_;
52 Jcode::convert(\$_,'euc','utf8');
53 #    from_to($_, "utf8","euc-jp");
54 if(/<channel/){
55
56 #  <channel id="0031.ontvjapan.com">
57 #    <display-name lang="ja_JP">NHK総合</display-name>
58 #    <display-name lang="en">NHK</display-name>
59 #  </channel>
60
61         s/^[\s]*//gio;
62         s/<channel//i;
63         #s/\"\/>/\" /i;
64         s/\"\>/\" /i;
65         s/\"[\s]/\";\n/gio;
66         s/[\w]*=/\$channel{$&}=/gio;
67         s/\=}=/}=/gio;
68         chomp();
69         eval("$_");
70 #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
79
80 }elsif(/<display-name lang=\"ja_JP/){
81         s/^[\s]*//gio;
82         chomp();
83         $channel{ja}  = &removetag($_);
84         #print Dumper($_) ;
85         #print "$result  \n";
86 }elsif(/<display-name lang=\"en/){
87         s/^[\s]*//gio;
88         chomp();
89         $channel{en}  = &removetag($_);
90         #print Dumper($_) ;
91         #print "$result  \n";
92
93 }elsif(/<\/channel>/){
94 # foltia 局リストに載ってない放送局は追加しない
95
96 #       print "$channel{id}
97 #$channel{ja}
98 #$channel{en}
99 #-------------------------------\n";
100
101         $channel{id} = "";
102         $channel{ja} = "";
103         $channel{en} = "";
104
105 }elsif (/<programme /){
106
107 # <programme start="20051112210000 +0900" stop="20051112225100 +0900" channel="0007.ontvjapan.com">
108 #    <title lang="ja_JP">土曜ワイド劇場</title>
109 #    <sub-title lang="ja_JP">「救命士・牧田さおり緊急出動!毒劇物災害の現場になぜ刺殺体?意識不明の患者と少年に謎の接点」</sub-title>
110 #    <desc lang="ja_JP">寺田敏雄脚本 岡本弘監督 浅野温子 宇崎竜童 遠藤憲一 細川ふみえ 石丸謙二郎 根岸季衣  そのまんま東</desc>
111 #    <category lang="ja_JP">ドラマ</category>
112 #    <category lang="en">series</category>
113 #  </programme>
114
115         s/<programme //i;
116         #s/\"\/>/\" /i;
117         s/\"\>/\" /i;
118         s/\"[\s]/\";\n/gio;
119         s/[\w]*=/\$item{$&}=/gio;
120         s/\=}=/}=/gio;
121         chomp();
122         eval("$_");
123         #print Dumper($_) ;
124         #print "$item{start}/$item{stop}/$item{channel}\n";
125         
126
127 }elsif(/<sub-title /){
128         s/^[\s]*//gio;
129         chomp();
130         $item{subtitle}  = &removetag($_);
131         #print Dumper($_) ;
132         #print "$result  \n";
133
134 }elsif(/<title /){
135         s/^[\s]*//gio;
136         chomp();
137         $item{title}  = &removetag($_);
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         }
182        
183         #print Dumper($_) ;
184         #print "$result  \n";
185
186
187 }elsif(/<\/programme>/){
188 #登録処理はココで
189 #&writelog("xmltv2foltia DEBUG call chkerase $item{'start'},$item{'channel'}");
190
191         &chkerase($item{'start'}, $item{'channel'});
192         if ($item{'subtitle'} ne "" ){
193             $registdesc = $item{'subtitle'}." ".$item{'desc'};
194 }else{
195             $registdesc = $item{'desc'};
196 }
197         &registdb($item{'start'},$item{'stop'},$item{'channel'},$item{'title'},$registdesc ,$item{'category'});
198
199 #       print "$item{start}
200 #$item{stop}
201 #$item{channel}
202 #$item{title}
203 #$item{desc}
204 #$item{category}
205 # -------------------------------\n";
206
207         $item{start} = "";
208         $item{stop} = "";
209         $item{channel} = "";
210         $item{title} = "";
211         $item{subtitle} = "";
212         $item{desc} = "";
213         $item{category} = "";
214         $registdesc = "";
215 }# endif
216 }# while
217
218 $dbh->commit;
219
220 #end
221 ################
222
223 sub chkerase{
224 # xmltvからきた日付とチャンネルをfoltia epgと比較
225 my $foltiastarttime = $_[0]; # 14桁
226 my $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 }
251 sub registdb{
252 my $foltiastarttime = $_[0];
253 my $foltiaendtime = $_[1];
254 my $channel = $_[2];
255 my $title = $_[3];
256 my $desc = $_[4];
257 my $category = $_[5];
258
259 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
260
261  
262 $foltiastarttime = substr($foltiastarttime,0,12);
263 $foltiaendtime = substr($foltiaendtime,0,12);
264
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         }
277 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
278 my $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
292 # &writelog("xmltv2foltia DEBUG $DBQuery");
293
294 }else{
295 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
296 }#未来じゃなければ挿入しない
297
298 }
299
300
301
302
303
304
305
306
307 sub removetag(){
308 my $str = $_[0];
309
310 # HTMLタグの正規表現 $tag_regex
311 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
312 my $comment_tag_regex =
313     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
314 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
315
316
317 my    $text_regex = q{[^<]*};
318
319  my   $result = '';
320     while ($str =~ /($text_regex)($tag_regex)?/gso) {
321       last if $1 eq '' and $2 eq '';
322       $result .= $1;
323       $tag_tmp = $2;
324       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
325         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
326         ($text_tmp = $1) =~ s/</&lt;/g;
327         $text_tmp =~ s/>/&gt;/g;
328         $result .= $text_tmp;
329       }
330     }
331
332
333 return $result ;
334
335 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed