root/trunk/install/perl/xmltv2foltia.pl

リビジョン 1, 7.3 kB (コミッタ: jplcom, コミット時期: 18 年 前)

initial import

  • 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 #XMLTVは
9 # http://www.systemcreate-inc.com/gsxr/pc/mythtv.html#patches
10 #のパッチをあてたものを想定しています。オリジナルと比較して、サブタイトルや内容など
11 #より秀才な内容を取得できます。
12 #
13 # usage;perl  /usr/bin/tv_grab_jp | ./xmltv2foltia.pl
14 #
15 #
16 # DCC-JPL Japan/foltia project
17 #
18 #
19
20 use LWP::Simple;
21 #use Encode qw(from_to);
22 #use encoding 'euc-jp', STDIN=>'utf8', STDOUT=>'euc-jp' ; # 標準入力:utf8
23 # http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
24 use Jcode;
25 # use Data::Dumper;
26 use Time::Local;
27 use DBI;
28 use DBD::Pg;
29
30 $path = $0;
31 $path =~ s/xmltv2foltia.pl$//i;
32 if ($pwd  ne "./"){
33 push( @INC, "$path");
34 }
35 require "foltialib.pl";
36
37 $currentworkdate = "" ;
38 $currentworkch = "" ;
39 $today =`date "+%Y%m%d"`;
40 $todaytime =`date "+%Y%m%d%H%M"`;
41
42 # DB Connect
43         my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d",
44                 $DBDriv,$DBName,$DBHost,$DBPort);
45          $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;;
46
47 while(<>){
48 #print $_;
49 Jcode::convert(\$_,'euc','utf8');
50 #    from_to($_, "utf8","euc-jp");
51 if(/<channel/){
52
53 #  <channel id="0031.ontvjapan.com">
54 #    <display-name lang="ja_JP">NHK総合</display-name>
55 #    <display-name lang="en">NHK</display-name>
56 #  </channel>
57
58         s/^[\s]*//gio;
59         s/<channel//i;
60         #s/\"\/>/\" /i;
61         s/\"\>/\" /i;
62         s/\"[\s]/\";\n/gio;
63         s/[\w]*=/\$channel{$&}=/gio;
64         s/\=}=/}=/gio;
65         chomp();
66         eval("$_");
67 #print Dumper($_) ;
68
69 }elsif(/<display-name lang=\"ja_JP/){
70         s/^[\s]*//gio;
71         chomp();
72         $channel{ja}  = &removetag($_);
73         #print Dumper($_) ;
74         #print "$result  \n";
75
76
77 }elsif(/<display-name lang=\"ja_JP/){
78         s/^[\s]*//gio;
79         chomp();
80         $channel{ja}  = &removetag($_);
81         #print Dumper($_) ;
82         #print "$result  \n";
83 }elsif(/<display-name lang=\"en/){
84         s/^[\s]*//gio;
85         chomp();
86         $channel{en}  = &removetag($_);
87         #print Dumper($_) ;
88         #print "$result  \n";
89
90 }elsif(/<\/channel>/){
91 # foltia 局リストに載ってない放送局は追加しない
92
93 #       print "$channel{id}
94 #$channel{ja}
95 #$channel{en}
96 #-------------------------------\n";
97
98         $channel{id} = "";
99         $channel{ja} = "";
100         $channel{en} = "";
101
102 }elsif (/<programme /){
103
104 # <programme start="20051112210000 +0900" stop="20051112225100 +0900" channel="0007.ontvjapan.com">
105 #    <title lang="ja_JP">土曜ワイド劇場</title>
106 #    <sub-title lang="ja_JP">「救命士・牧田さおり緊急出動!毒劇物災害の現場になぜ刺殺体?意識不明の患者と少年に謎の接点」</sub-title>
107 #    <desc lang="ja_JP">寺田敏雄脚本 岡本弘監督 浅野温子 宇崎竜童 遠藤憲一 細川ふみえ 石丸謙二郎 根岸季衣  そのまんま東</desc>
108 #    <category lang="ja_JP">ドラマ</category>
109 #    <category lang="en">series</category>
110 #  </programme>
111
112         s/<programme //i;
113         #s/\"\/>/\" /i;
114         s/\"\>/\" /i;
115         s/\"[\s]/\";\n/gio;
116         s/[\w]*=/\$item{$&}=/gio;
117         s/\=}=/}=/gio;
118         chomp();
119         eval("$_");
120         #print Dumper($_) ;
121         #print "$item{start}/$item{stop}/$item{channel}\n";
122         
123
124 }elsif(/<sub-title /){
125         s/^[\s]*//gio;
126         chomp();
127         $item{subtitle}  = &removetag($_);
128         #print Dumper($_) ;
129         #print "$result  \n";
130
131 }elsif(/<title /){
132         s/^[\s]*//gio;
133         chomp();
134         $item{title}  = &removetag($_);
135         #print Dumper($_) ;
136         #print "$result  \n";
137
138 }elsif(/<desc /){
139         s/^[\s]*//gio;
140         chomp();
141         $item{desc}  = &removetag($_);
142         #print Dumper($_) ;
143         #print "$result  \n";
144
145 }elsif(/<category lang=\"ja_JP/){
146         s/^[\s]*//gio;
147         chomp();
148         $item{category} = &removetag($_);
149         #print Dumper($_) ;
150         #print "$result  \n";
151
152
153 }elsif(/<\/programme>/){
154 #登録処理はココで
155 #&writelog("xmltv2foltia DEBUG call chkerase $item{start},$item{channel}");
156
157 &chkerase($item{start},$item{channel});
158 if ($item{subtitle} ne "" ){
159         $registdesc = $item{subtitle}." ".$item{desc};
160 }else{
161         $registdesc = $item{desc};
162 }
163 &registdb($item{start},$item{stop},$item{channel},$item{title},$registdesc ,$item{category});
164
165 #       print "$item{start}
166 #$item{stop}
167 #$item{channel}
168 #$item{title}
169 #$item{desc}
170 #$item{category}
171 # -------------------------------\n";
172
173         $item{start} = "";
174         $item{stop} = "";
175         $item{channel} = "";
176         $item{title} = "";
177         $item{subtitle} = "";
178         $item{desc} = "";
179         $item{category} = "";
180         $registdesc = "";
181 }# endif
182 }# while
183
184 sub chkerase{
185 # xmltvからきた日付とチャンネルをfoltia epgと比較
186 my $foltiastarttime = $_[0]; # 14桁
187 my $ontvepgchannel =  $_[1];
188 my $epgstartdate = substr($foltiastarttime,0,8); # 8桁 20050807
189 my  @epgcounts = "";
190 my $DBQuery = "";
191
192 #if ($currentworkdate eq "" ){#初回起動なら
193 if ( $currentworkch ne $ontvepgchannel){
194
195
196 if ($epgstartdate >= $today){# xmltvtvから今日以降のデータが来ていれば
197 my $epgstartdatetime = $today * 10000 ; # 200508070000 12桁
198 # 新規に入る予定の未来の番組表、全部いったん消す
199 # $DBQuery =  "DELETE from foltia_epg where startdatetime > $epgstartdatetime AND ontvchannel = '$ontvepgchannel' ";
200  $DBQuery =  "DELETE from foltia_epg where startdatetime > $todaytime AND ontvchannel = '$ontvepgchannel' ";
201          $sth = $dbh->prepare($DBQuery);
202         $sth->execute();
203 &writelog("xmltv2foltia DELETE EPG $epgstartdatetime:$DBQuery");
204 #$currentworkdate = "$today";
205 $currentworkch = $ontvepgchannel ;
206 }else{
207         &writelog("xmltv2foltia ERROR EPG INVALID:$epgstartdate:$today");
208         #exit();
209 }# endif xmltvtvから今日のデータが来ていれば
210 }#end if 初回起動なら
211
212 }
213 sub registdb{
214 my $foltiastarttime = $_[0];
215 my $foltiaendtime = $_[1];
216 my $channel = $_[2];
217 my $title = $_[3];
218 my $desc = $_[4];
219 my $category = $_[5];
220
221 #&writelog("xmltv2foltia DEBUG $foltiastarttime:$foltiaendtime");
222
223  
224 $foltiastarttime = substr($foltiastarttime,0,12);
225 $foltiaendtime = substr($foltiaendtime,0,12);
226
227 if($foltiastarttime > $todaytime){
228        
229         my $DBQuery =  "SELECT max(epgid) FROM foltia_epg ";
230                  $sth = $dbh->prepare($DBQuery);
231                 $sth->execute();
232          @currentepgid = $sth->fetchrow_array;
233          
234         if ($currentepgid[0] < 1 ){
235                 $newepgid = 1;
236         }else{
237                 $newepgid = $currentepgid[0];
238                 $newepgid++;
239         }
240 #&writelog("xmltv2foltia DEBUG $currentepgid[0] /  $newepgid");
241 my $lengthmin = &calclength($foltiastarttime , $foltiaendtime);
242 $newepgid = $dbh->quote($newepgid );
243 $foltiastarttime = $dbh->quote($foltiastarttime);
244 $foltiaendtime = $dbh->quote($foltiaendtime );
245 $lengthmin = $dbh->quote($lengthmin );
246 $channel = $dbh->quote($channel );
247 $title = $dbh->quote($title);
248 $desc = $dbh->quote($desc);
249 $category = $dbh->quote($category);
250
251 $DBQuery =  "insert into  foltia_epg values ($newepgid,$foltiastarttime,$foltiaendtime,$lengthmin,$channel,$title,$desc,$category)";
252 #       $DBQuery = $dbh->quote($DBQuery);
253          $sth = $dbh->prepare($DBQuery);
254         $sth->execute();
255
256
257 # &writelog("xmltv2foltia DEBUG $DBQuery");
258
259 }else{
260 #&writelog("xmltv2foltia DEBUG SKIP $foltiastarttime:$foltiaendtime");
261 }#未来じゃなければ挿入しない
262
263 }
264
265
266
267
268
269
270
271
272 sub removetag(){
273 my $str = $_[0];
274
275 # HTMLタグの正規表現 $tag_regex
276 my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; #'}}}}
277 my $comment_tag_regex =
278     '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
279 my $tag_regex = qq{$comment_tag_regex|<$tag_regex_};
280
281
282 my    $text_regex = q{[^<]*};
283
284  my   $result = '';
285     while ($str =~ /($text_regex)($tag_regex)?/gso) {
286       last if $1 eq '' and $2 eq '';
287       $result .= $1;
288       $tag_tmp = $2;
289       if ($tag_tmp =~ /^<(XMP|PLAINTEXT|SCRIPT)(?![0-9A-Za-z])/i) {
290         $str =~ /(.*?)(?:<\/$1(?![0-9A-Za-z])$tag_regex_|$)/gsi;
291         ($text_tmp = $1) =~ s/</&lt;/g;
292         $text_tmp =~ s/>/&gt;/g;
293         $result .= $text_tmp;
294       }
295     }
296
297
298 return $result ;
299
300 } # end sub removetag
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed