root/trunk/install/perl/xmltv2foltia.pl

リビジョン 27, 7.3 kB (コミッタ: sorshi, コミット時期: 17 年 前)

コメント修正

  • 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
33 $path = $0;
34 $path =~ s/xmltv2foltia.pl$//i;
35 if ($pwd  ne "./"){
36 push( @INC, "$path");
37 }
38 require "foltialib.pl";
39
40 $currentworkdate = "" ;
41 $currentworkch = "" ;
42 $today =`date "+%Y%m%d"`;
43 $todaytime =`date "+%Y%m%d%H%M"`;
44
45 # DB Connect
46         my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d",
47                 $DBDriv,$DBName,$DBHost,$DBPort);
48          $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;;
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         #print Dumper($_) ;
153         #print "$result  \n";
154
155
156 }elsif(/<\/programme>/){
157 #登録処理はココで
158 #&writelog("xmltv2foltia DEBUG call chkerase $item{start},$item{channel}");
159
160 &chkerase($item{start},$item{channel});
161 if ($item{subtitle} ne "" ){
162         $registdesc = $item{subtitle}." ".$item{desc};
163 }else{
164         $registdesc = $item{desc};
165 }
166 &registdb($item{start},$item{stop},$item{channel},$item{title},$registdesc ,$item{category});
167
168 #       print "$item{start}
169 #$item{stop}
170 #$item{channel}
171 #$item{title}
172 #$item{desc}
173 #$item{category}
174 # -------------------------------\n";
175
176         $item{start} = "";
177         $item{stop} = "";
178         $item{channel} = "";
179         $item{title} = "";
180         $item{subtitle} = "";
181         $item{desc} = "";
182         $item{category} = "";
183         $registdesc = "";
184 }# endif
185 }# while
186
187 sub chkerase{
188 # xmltvからきた日付とチャンネルをfoltia epgと比較
189 my $foltiastarttime = $_[0]; # 14桁
190 my $ontvepgchannel =  $_[1];
191 my $epgstartdate = substr($foltiastarttime,0,8); # 8桁 20050807
192 my  @epgcounts = "";
193 my $DBQuery = "";
194
195 #if ($currentworkdate eq "" ){#初回起動なら
196 if ( $currentworkch ne $ontvepgchannel){
197
198
199 if ($epgstartdate >= $today){# xmltvtvから今日以降のデータが来ていれば
200 my $epgstartdatetime = $today * 10000 ; # 200508070000 12桁
201 # 新規に入る予定の未来の番組表、全部いったん消す
202 # $DBQuery =  "DELETE from foltia_epg where startdatetime > $epgstartdatetime AND ontvchannel = '$ontvepgchannel' ";
203  $DBQuery =  "DELETE from foltia_epg where startdatetime > $todaytime AND ontvchannel = '$ontvepgchannel' ";
204          $sth = $dbh->prepare($DBQuery);
205         $sth->execute();
206 &writelog("xmltv2foltia DELETE EPG $epgstartdatetime:$DBQuery");
207 #$currentworkdate = "$today";
208 $currentworkch = $ontvepgchannel ;
209 }else{
210         &writelog("xmltv2foltia ERROR EPG INVALID:$epgstartdate:$today");
211         #exit();
212 }# endif xmltvtvから今日のデータが来ていれば
213 }#end if 初回起動なら
214
215 }
216 sub registdb{
217 my $foltiastarttime = $_[0];
218 my $foltiaendtime = $_[1];
219 my $channel = $_[2];
220 my $title = $_[3];
221 my $desc = $_[4];
222 my $category = $_[5];
223
224 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
225
226  
227 $foltiastarttime = substr($foltiastarttime,0,12);
228 $foltiaendtime = substr($foltiaendtime,0,12);
229
230 if($foltiastarttime > $todaytime){
231        
232         my $DBQuery =  "SELECT max(epgid) FROM foltia_epg ";
233                  $sth = $dbh->prepare($DBQuery);
234                 $sth->execute();
235          @currentepgid = $sth->fetchrow_array;
236          
237         if ($currentepgid[0] < 1 ){
238                 $newepgid = 1;
239         }else{
240                 $newepgid = $currentepgid[0];
241                 $newepgid++;
242         }
243 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
244 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
245 $newepgid = $dbh->quote($newepgid );
246 $foltiastarttime = $dbh->quote($foltiastarttime);
247 $foltiaendtime = $dbh->quote($foltiaendtime );
248 $lengthmin = $dbh->quote($lengthmin );
249 $channel = $dbh->quote($channel );
250 $title = $dbh->quote($title);
251 $desc = $dbh->quote($desc);
252 $category = $dbh->quote($category);
253
254 $DBQuery =  "insert into  foltia_epg values ($newepgid,$foltiastarttime,$foltiaendtime,$lengthmin,$channel,$title,$desc,$category)";
255 #       $DBQuery = $dbh->quote($DBQuery);
256          $sth = $dbh->prepare($DBQuery);
257         $sth->execute();
258
259
260 # &writelog("xmltv2foltia DEBUG $DBQuery");
261
262 }else{
263 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
264 }#未来じゃなければ挿入しない
265
266 }
267
268
269
270
271
272
273
274
275 sub removetag(){
276 my $str = $_[0];
277
278 # HTMLタグの正規表現 $tag_regex
279 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
280 my $comment_tag_regex =
281     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
282 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
283
284
285 my    $text_regex = q{[^<]*};
286
287  my   $result = '';
288     while ($str =~ /($text_regex)($tag_regex)?/gso) {
289       last if $1 eq '' and $2 eq '';
290       $result .= $1;
291       $tag_tmp = $2;
292       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
293         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
294         ($text_tmp = $1) =~ s/</&lt;/g;
295         $text_tmp =~ s/>/&gt;/g;
296         $result .= $text_tmp;
297       }
298     }
299
300
301 return $result ;
302
303 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed