OSDN Git Service

modified: epgwakealarm.php 省電力少し修正
[epgrec/epgrec.git] / storeProgram.inc.php
1 <?php
2 include_once( INSTALL_PATH . "/reclib.php" );
3
4 function garbageClean() {
5         // 不要なプログラムの削除
6         // 8日以上前のプログラムを消す
7         $arr = array();
8         $arr = DBRecord::createRecords(  PROGRAM_TBL, "WHERE endtime < subdate( now(), 8 )" );
9         foreach( $arr as $val ) $val->delete();
10         
11         // 8日以上先のデータがあれば消す
12         $arr = array();
13         $arr = DBRecord::createRecords(  PROGRAM_TBL, "WHERE starttime  > adddate( now(), 8 ) ");
14         foreach( $arr as $val ) $val->delete();
15
16         // 10日以上前のログを消す
17         $arr = array();
18         $arr = DBRecord::createRecords(  LOG_TBL, "WHERE logtime < subdate( now(), 10 )" );
19         foreach( $arr as $val ) $val->delete();
20 }
21
22 function doKeywordReservation() {
23   // キーワード自動録画予約
24         $arr = array();
25         $arr = Keyword::createKeywords();
26         foreach( $arr as $val ) {
27                 try {
28                         $val->reservation();
29                 }
30                 catch( Exception $e ) {
31                         // 無視
32                 }
33         }
34 }
35
36 function storeProgram( $type, $xmlfile ) {
37         global $BS_CHANNEL_MAP, $GR_CHANNEL_MAP, $CS_CHANNEL_MAP;
38         global $settings;
39         
40         // チャンネルマップファイルの準備
41         $map = array();
42         if( $type == "BS" ) $map = $BS_CHANNEL_MAP;
43         else if( $type == "GR") $map = $GR_CHANNEL_MAP;
44         else if( $type == "CS") $map = $CS_CHANNEL_MAP;
45         
46         // XML parse
47         $xml = @simplexml_load_file( $xmlfile );
48         if( $xml === false ) {
49                 reclog( "getepg:: 正常な".$xmlfile."が作成されなかった模様(放送間帯でないなら問題ありません)", EPGREC_WARN );
50                 return; // XMLが読み取れないなら何もしない
51         }
52         // channel抽出
53         foreach( $xml->channel as $ch ) {
54                 $disc = $ch['id'];
55          try {
56                 // チャンネルデータを探す
57                 $num = DBRecord::countRecords( CHANNEL_TBL , "WHERE channel_disc = '" . $disc ."'" );
58                 if( $num == 0 ) {
59                         if( array_key_exists( "$disc", $map ) ) {
60                                 // チャンネルデータがないなら新規作成
61                                 $rec = new DBRecord( CHANNEL_TBL );
62                                 $rec->type = $type;
63                                 $rec->channel = $map["$disc"];
64                                 $rec->channel_disc = $disc;
65                                 $rec->name = $ch->{'display-name'};
66                         }
67                 }
68                 else {
69                         // 存在した場合も、とりあえずチャンネル名は更新する
70                         $rec = new DBRecord(CHANNEL_TBL, "channel_disc", $disc );
71                         $rec->name = $ch->{'display-name'};
72                 }
73          }
74          catch( Exception $e ) {
75                 reclog( "getepg::DBの接続またはチャンネルテーブルの書き込みに失敗", EPGREC_ERROR );
76          }
77         }
78         // channel 終了
79         
80         // programme 取得
81         
82         foreach( $xml->programme as $program ) {
83                 $channel_rec = null;
84                 
85                 $channel_disc = $program['channel']; 
86                 if( ! array_key_exists( "$channel_disc", $map ) ) continue;
87                 $channel = $map["$channel_disc"];
88                 
89                 try {
90                         $channel_rec = new DBRecord(CHANNEL_TBL, "channel_disc", "$channel_disc" );
91                 }
92                 catch( Exception $e ) {
93                         reclog( "getepg::チャンネルレコード $channel_disc が発見できない", EPGREC_ERROR );
94                 }
95                 if( $channel_rec == null ) continue;    // あり得ないことが起きた
96                 if( $channel_rec->skip == 1 ) continue; // 受信しないチャンネル
97                 
98                 $starttime = str_replace(" +0900", '', $program['start'] );
99                 $endtime = str_replace( " +0900", '', $program['stop'] );
100                 $title = $program->title;
101                 $desc = $program->desc;
102                 $cat_ja = "";
103                 $cat_en = "";
104                 foreach( $program->category as $cat ) {
105                         if( $cat['lang'] == "ja_JP" ) $cat_ja = $cat;
106                         if( $cat['lang'] == "en" ) $cat_en = $cat;
107                 }
108                 $program_disc = md5( $channel_disc . $starttime . $endtime );
109                 // printf( "%s %s %s %s %s %s %s \n", $program_disc, $channel, $starttime, $endtime, $title, $desc, $cat_ja );
110                 
111                 // カテゴリ登録
112                 
113                 $cat_rec = null;
114                 try {
115                         // カテゴリを処理する
116                         $category_disc = md5( $cat_ja . $cat_en );
117                         $num = DBRecord::countRecords(CATEGORY_TBL, "WHERE category_disc = '".$category_disc."'" );
118                         if( $num == 0 ) {
119                                 // 新規カテゴリの追加
120                                 $cat_rec = new DBRecord( CATEGORY_TBL );
121                                 $cat_rec->name_jp = $cat_ja;
122                                 $cat_rec->name_en = $cat_en;
123                                 $cat_rec->category_disc = $category_disc;
124                                 reclog("getepg:: 新規カテゴリ".$cat_ja."を追加" );
125                         }
126                         else
127                                 $cat_rec = new DBRecord(CATEGORY_TBL, "category_disc" , $category_disc );
128                 }
129                 catch( Exception $e ) {
130                         reclog("getepg:: カテゴリテーブルのアクセスに失敗した模様", EPGREC_ERROR );
131                         reclog("getepg:: ".$e->getMessage()."" ,EPGREC_ERROR );
132                         exit( $e->getMessage() );
133                 }
134                 
135                 // プログラム登録
136                 
137                 try {
138                         //
139                         $num = DBRecord::countRecords(PROGRAM_TBL, "WHERE program_disc = '".$program_disc."'" );
140                         if( $num == 0 ) {
141                                 // 新規番組
142                                 // 重複チェック 同時間帯にある番組
143                                 $options = "WHERE channel_disc = '".$channel_disc."' ".
144                                         "AND starttime < '". $endtime ."' AND endtime > '".$starttime."'";
145                                 $battings = DBRecord::countRecords(PROGRAM_TBL, $options );
146                                 if( $battings > 0 ) {
147                                         // 重複発生=おそらく放映時間の変更
148                                         $records = DBRecord::createRecords(PROGRAM_TBL, $options);
149                                         foreach( $records as $rec ) {
150                                                 // 自動録画予約された番組は放映時間変更と同時にいったん削除する
151                                                 try {
152                                                         $reserve = new DBRecord(RESERVE_TBL, "program_id", $rec->id );
153                                                         // すでに開始されている録画は無視する
154                                                         if( time() > (toTimestamp($reserve->starttime) - PADDING_TIME - $settings->former_time) ) {
155                                                                 reclog( "getepg::録画ID".$reserve->id.":".$reserve->type.$reserve->channel.$reserve->title."は録画開始後に時間変更が発生した可能性がある", EPGREC_WARN );
156                                                         }
157                                                         else {
158                                                                 if( $reserve->autorec ) {
159                                                                         reclog( "getepg::録画ID".$reserve->id.":".$reserve->type.$reserve->channel.$reserve->title."は時間変更の可能性があり予約取り消し" );
160                                                                         Reservation::cancel( $reserve->id );
161                                                                 }
162                                                         }
163                                                 }
164                                                 catch( Exception $e ) {
165                                                         // 無視
166                                                 }
167                                                 // 番組削除
168                                                 reclog( "getepg::放送時間重複が発生した番組ID".$rec->id." ".$rec->type.$rec->channel.$rec->title."を削除" );
169                                                 $rec->delete();
170                                         }
171                                 }
172                                 // //
173                                 $rec = new DBRecord( PROGRAM_TBL );
174                                 $rec->channel_disc = $channel_disc;
175                                 $rec->channel_id = $channel_rec->id;
176                                 $rec->type = $type;
177                                 $rec->channel = $channel_rec->channel;
178                                 $rec->title = $title;
179                                 $rec->description = $desc;
180                                 $rec->category_id = $cat_rec->id;
181                                 $rec->starttime = $starttime;
182                                 $rec->endtime = $endtime;
183                                 $rec->program_disc = $program_disc;
184                                 $rec->update();
185                         }
186                         else {
187                                 // 番組内容更新
188                                 $rec = new DBRecord( PROGRAM_TBL, "program_disc", $program_disc );
189                                 $rec->title = $title;
190                                 $rec->description = $desc;
191                                 $rec->category_id = $cat_rec->id;
192                                 $rec->update();
193                                 try {
194                                         $reserve = new DBRecord( RESERVE_TBL, "program_id", $rec->id );
195                                         // dirtyが立っておらず現在より後の録画予約であるなら
196                                         if( ($reserve->dirty == 0) && (toTimestamp($reserve->starttime) > time()) ) {
197                                                 $reserve->title = $title;
198                                                 $reserve->description = $desc;
199                                                 reclog( "getepg:: 予約ID".$reserve->id."のEPG情報が更新された" );
200                                                 $reserve->update();
201                                         }
202                                 }
203                                 catch( Exception $e ) {
204                                         // 無視する
205                                 }
206                                 // 書き込む
207                         }
208                 }
209                 catch(Exception $e) {
210                         reclog( "getepg:: プログラムテーブルに問題が生じた模様", EPGREC_ERROR );
211                         reclog( "getepg:: ".$e->getMessage()."" , EPGREC_ERROR);
212                         exit( $e->getMessage() );
213                 }
214         }
215         // Programme取得完了
216 }
217 ?>