#!/usr/bin/perl
#
# Anime recording system foltia
# http://www.dcc-jpl.com/soft/foltia/
#
# usage :getxml2db [long]
#しょぼいカレンダーから番組データXMLを取得しfoltia DBにインポートする
#
#オプション
#long:2週間分取り込む。このモードで一日一回回せばよいでしょう。
#
# DCC-JPL Japan/foltia project
#
#
use LWP::Simple;
use Jcode;
use Time::Local;
use DBI;
use DBD::Pg;
use DBD::SQLite;
use Digest::MD5 qw(md5_hex);
$path = $0;
$path =~ s/getxml2db.pl$//i;
if ($path ne "./"){
push( @INC, "$path");
}
require "foltialib.pl";
$processes = &processfind("getxml2db.pl");
if ($processes > 1 ){
#print "process found:$processes\n";
&writelog("getxml2db processes exist. exit:");
exit;
}else{
#print "process NOT found:$processes\n";
&writelog("getxml2db Normal launch.");
}
# http://sites.google.com/site/syobocal/spec/cal_chk-php
#if ($ARGV[0] eq "long"){
# $uri="http://cal.syoboi.jp/cal_chk.php";
# #$uri="http://syobocal.orz.hm/cal_chk.php";
# &writelog("getxml2db use long mode.");
#}else{
# $uri="http://cal.syoboi.jp/cal_chk.xml";
# #$uri="http://syobocal.orz.hm/cal_chk.xml";
#}
$uri = "http://cal.syoboi.jp/cal_chk.php?days=";
$uri .= ($ARGV[0] eq "long")? 14: 7;
$dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;;
$dbh->{AutoCommit} = 0;
# If-Modified-Since使うように変更#2008/11/14
my $CacheDir = '/tmp/shobocal';
if (! -e $CacheDir) {
mkdir $CacheDir or die "cannot create $CacheDir: $!";
}
my $cache = sprintf("%s/%s.xml", $CacheDir, Digest::MD5::md5_hex($uri));
LWP::Simple::mirror($uri, $cache) or die "cannot get content from $uri";
open(SHOBO, "<$cache");
my (@line) = ;
close(SHOBO);
#my ($content) = get("$uri");
#if ($content eq ""){
#&writelog("getxml2db no responce from $uri, exit:");
# exit;#しょぼかるが落ちているなど
#}
#my (@line) = split(/\n/, $content);
foreach(@line){
s/\xef\xbd\x9e/\xe3\x80\x9c/g; #wavedash
s/\xef\xbc\x8d/\xe2\x88\x92/g; #hyphenminus
s/([0-9A-Fa-f]{2,6});/(chr($1))/eg; #'遊戯王5D's'とかの数値参照対応を
Jcode::convert(\$_,'euc','utf8');
#
if (/^/\" /i;
s/\"[\s]/\";\n/gio;
s/\'/\\'/gio;
s/\"/\'/gio;
#s/[\w]*=/\$item{$&}=/gio;
#s/\=}=/}=/gio;
s/(\w+)=/\$item{$1}=/gio;#by foltiaBBS
#$item{PID}='21543';
#$item{TID}='528';
#$item{StTime}='20041114213000';
#$item{EdTime}='20041114220000';
#$item{ChName}='AT-X';
#$item{Count}='4';
#$item{StOffset}='0';
#$item{SubTitle}='いやだよ、サヨナラ…';
#$item{Title}='おとぎストーリー 天使のしっぽ';
#$item{ProgComment}='';
eval("$_");
#Jcode::convert(\$item{Title},'euc');
$programtitlename = $item{Title};
$programtitlename =~ s/\<\;//gi;
$programtitlename =~ s/\&\;/\&/gi;
# $programtitle = $dbh->quote($programtitlename);
$programtitle = $programtitlename;
#Jcode::convert(\$item{ChName},'euc');
#Jcode::convert(\$item{SubTitle},'euc');
#$programSubTitle = $dbh->quote($item{SubTitle});
$programSubTitle = $item{SubTitle};
$programSubTitle =~ s/\<\;//gi;
$programSubTitle =~ s/\&\;/\&/gi;
# $programSubTitle = $dbh->quote($programSubTitle);
$offsetmin = $item{StOffset}/60;
$edtime = &syobocaldate2foltiadate($item{EdTime});
$sttime = &syobocaldate2foltiadate($item{StTime});
$length = &calclength($sttime,$edtime);
$recstartdate = &calcoffsetdate($sttime ,$offsetmin );
$recenddate = &calcoffsetdate($edtime ,$offsetmin );
$stationid = &getstationid($item{ChName});
#サブタイトル追加-------------------------------------------------
#番組があるか確認
$sth = $dbh->prepare($stmt{'getxml2db.1'});
$sth->execute($item{TID});
@titlecount= $sth->fetchrow_array;
if ($titlecount[0] == 0){
#なければ追加
#200412012359
$nomalstarttime = substr($sttime,8,4);
$sth = $dbh->prepare($stmt{'getxml2db.2'});
$oserr = $sth->execute($item{TID}, $programtitle, '', $nomalstarttime, $length, '', '', 3, 1, '', '');
&writelog("getxml2db ADD TV Progtam:$item{TID}:$programtitle");
}else{
#2006/2/26
#あったら、タイトル確認して
$sth = $dbh->prepare($stmt{'getxml2db.3'});
$sth->execute($item{TID});
@titlearray = $sth->fetchrow_array;
#更新などされてたらupdate
#print "$titlearray[0] / $programtitle\n";
if ($titlearray[0] ne "$programtitlename" ){
$sth = $dbh->prepare($stmt{'getxml2db.4'});
$oserr = $sth->execute($programtitle, $item{TID});
&writelog("getxml2db UPDATE TV Progtam:$item{TID}:$programtitle");
}#end if update
}# end if TID
#PIDがあるか確認
$sth = $dbh->prepare($stmt{'getxml2db.5'});
$sth->execute($item{'TID'}, $item{'PID'});
@subticount= $sth->fetchrow_array;
if ($subticount[0] >= 1){
#PIDあったら上書き更新
#ここでこんなエラー出てる
# DBD::Pg::st execute failed: ERROR: invalid input syntax for type bigint: "" at /home/foltia/perl/getxml2db.pl line 147.
#UPDATE foltia_subtitle SET stationid = '42',countno = '8',subtitle = '京都行きます' ,startdatetime = '200503010035' ,enddatetime = '200503010050',startoffset = '0' ,lengthmin = '15' WHERE tid = '550' AND pid = '26000'
if ($item{Count} == ""){
$sth = $dbh->prepare($stmt{'getxml2db.6'});
$oserr = $sth->execute($stationid, undef, $programSubTitle, $recstartdate, $recenddate, $offsetmin, $length, $item{'TID'}, $item{'PID'});
}else{
$sth = $dbh->prepare($stmt{'getxml2db.7'});
$oserr = $sth->execute($stationid, $item{'Count'}, $programSubTitle, $recstartdate, $recenddate, $offsetmin, $length, $item{'TID'}, $item{'PID'});
}
}else{
#なければ追加
#こっちに入る時刻はオフセットされた時刻!
#そのままキューに入る形で
if ($item{Count} eq ""){
$sth = $dbh->prepare($stmt{'getxml2db.8'});
$oserr = $sth->execute($item{'PID'}, $item{'TID'}, $stationid, undef, $programSubTitle, $recstartdate, $recenddate, $offsetmin, $length);
}else{
$sth = $dbh->prepare($stmt{'getxml2db.9'});
$oserr = $sth->execute($item{'PID'}, $item{'TID'}, $stationid, $item{'Count'}, $programSubTitle, $recstartdate, $recenddate, $offsetmin, $length);
}
}
#print "$DBQuery\n\n\n";
#debug 20050803
#&writelog("getxml2db $DBQuery");
}#if
}#foreach
$oserr = $dbh->commit;
## $dbh->disconnect();