OSDN Git Service

new: EPG取得の並列化テストを追加
authoryoneda <yoneda@recorder.localnet.mda.or.jp>
Sun, 28 Feb 2010 14:58:36 +0000 (23:58 +0900)
committeryoneda <yoneda@recorder.localnet.mda.or.jp>
Sun, 28 Feb 2010 14:58:36 +0000 (23:58 +0900)
getepg2.php [new file with mode: 0755]
storeProgram.php [new file with mode: 0755]

diff --git a/getepg2.php b/getepg2.php
new file mode 100755 (executable)
index 0000000..aefd510
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/php
+<?php
+  include_once('config.php');
+  include_once( INSTALL_PATH . '/DBRecord.class.php' );
+  include_once( INSTALL_PATH . '/Reservation.class.php' );
+  include_once( INSTALL_PATH . '/Keyword.class.php' );
+  include_once( INSTALL_PATH . '/Settings.class.php' );
+  
+  $settings = Settings::factory();
+
+  if( file_exists( $settings->temp_data ) ) @unlink( $settings->temp_data );
+  
+  // BSを処理する
+  if( $settings->bs_tuners != 0 ) {
+       // 録画重複チェック
+       $num = DBRecord::countRecords(  RESERVE_TBL, "WHERE complete = '0' AND (type = 'BS' OR type = 'CS') AND endtime > now() AND starttime < addtime( now(), '00:03:05')" );
+       if( ($num == 0) && !file_exists($settings->temp_xml."_bs") ) {
+               $cmdline = "CHANNEL=211 DURATION=180 TYPE=BS TUNER=0 MODE=0 OUTPUT=".$settings->temp_data." ".DO_RECORD . " >/dev/null 2>&1";
+               exec( $cmdline );
+               $cmdline = $settings->epgdump." /BS ".$settings->temp_data." ".$settings->temp_xml."_bs";
+               exec( $cmdline );
+               $cmdline = INSTALL_PATH."/storeProgram.php BS ".$settings->temp_xml."_bs";
+               exec( $cmdline );
+               if( file_exists( $settings->temp_data ) ) @unlink( $settings->temp_data );
+       }
+
+       // CS
+       if ($settings->cs_rec_flg != 0) {
+               $num = DBRecord::countRecords(  RESERVE_TBL, "WHERE complete = '0' AND (type = 'BS' OR type = 'CS') AND endtime > now() AND starttime < addtime( now(), '00:03:05')" );
+               if( ($num == 0) && !file_exists($settings->temp_xml."_cs01") ) {
+                       $cmdline = "CHANNEL=CS8 DURATION=120 TYPE=CS TUNER=0 MODE=0 OUTPUT=".$settings->temp_data." ".DO_RECORD . " >/dev/null 2>&1";
+                       exec( $cmdline );
+                       $cmdline = $settings->epgdump." /CS ".$settings->temp_data." ".$settings->temp_xml."_cs01";
+                       exec( $cmdline );
+                       $cmdline = INSTALL_PATH."/storeProgram.php CS ".$settings->temp_xml."_cs01";
+                       exec( $cmdline );
+                       if( file_exists( $settings->temp_data ) ) @unlink( $settings->temp_data );
+               }
+               $num = DBRecord::countRecords(  RESERVE_TBL, "WHERE complete = '0' AND (type = 'BS' OR type = 'CS') AND endtime > now() AND starttime < addtime( now(), '00:03:05')" );
+               if( ($num == 0) && !file_exists($settings->temp_xml."_cs02") ) {
+                       $cmdline = "CHANNEL=CS24 DURATION=120 TYPE=CS TUNER=0 MODE=0 OUTPUT=".$settings->temp_data." ".DO_RECORD . " >/dev/null 2>&1";
+                       exec( $cmdline );
+                       $cmdline = $settings->epgdump." /CS ".$settings->temp_data." ".$settings->temp_xml."_cs02";
+                       exec( $cmdline );
+                       $cmdline = INSTALL_PATH."/storeProgram.php CS ".$settings->temp_xml."_cs02";
+                       exec( $cmdline );
+                       if( file_exists( $settings->temp_data ) ) @unlink( $settings->temp_data );
+               }
+       }
+  }
+  
+  // 地上波を処理する
+  if( $settings->gr_tuners != 0 ) {
+       foreach( $GR_CHANNEL_MAP as $key=>$value ){
+               // 録画重複チェック
+               $num = DBRecord::countRecords(  RESERVE_TBL, "WHERE complete = '0' AND type = 'GR' AND endtime > now() AND starttime < addtime( now(), '00:01:10')" );
+               if( ($num == 0) && !file_exists($settings->temp_xml."_".$value."") ) {
+                       $cmdline = "CHANNEL=".$value." DURATION=60 TYPE=GR TUNER=0 MODE=0 OUTPUT=".$settings->temp_data." ".DO_RECORD . " >/dev/null 2>&1";
+                       exec( $cmdline );
+                       $cmdline = $settings->epgdump." ".$key." ".$settings->temp_data." ".$settings->temp_xml."_".$value."";
+                       exec( $cmdline );
+                       $cmdline = INSTALL_PATH."/storeProgram.php GR ".$settings->temp_xml."_".$value."";
+                       exec( $cmdline );
+                       if( file_exists( $settings->temp_data ) ) @unlink( $settings->temp_data );
+               }
+       }
+  }
+  
+?>
\ No newline at end of file
diff --git a/storeProgram.php b/storeProgram.php
new file mode 100755 (executable)
index 0000000..58a3724
--- /dev/null
@@ -0,0 +1,193 @@
+#!/usr/bin/php
+<?php
+
+  $type = $argv[1];    // BS CS GR
+  $file = $argv[2];    // XMLファイル
+  
+  
+  // SIGTERMシグナル
+  function handler( $signo = 0 ) {
+       global $file;
+       if( file_exists( $file ) ) {
+               @unlink( $file );
+       }
+       exit();
+  }
+  
+  // デーモン化
+  function daemon() {
+       if( pcntl_fork() != 0 )
+               exit();
+       posix_setsid();
+       if( pcntl_fork() != 0 )
+               exit;
+       pcntl_signal(SIGTERM, "handler");
+  }
+  
+  
+  // デーモン化
+  daemon();
+  // プライオリティ低に
+  pcntl_setpriority(20);
+  
+  include_once('config.php');
+  include_once( INSTALL_PATH . '/DBRecord.class.php' );
+  include_once( INSTALL_PATH . '/Reservation.class.php' );
+  include_once( INSTALL_PATH . '/Keyword.class.php' );
+  include_once( INSTALL_PATH . '/Settings.class.php' );
+  
+  $settings = Settings::factory();
+  
+  if( file_exists( $file ) ) {
+       storeProgram( $type, $file );
+       @unlink( $file );
+  }
+  
+  // 不要なプログラムの削除
+  // 8日以上前のプログラムを消す
+  $arr = array();
+  $arr = DBRecord::createRecords(  PROGRAM_TBL, "WHERE endtime < subdate( now(), 8 )" );
+  foreach( $arr as $val ) $val->delete();
+       
+  // 8日以上先のデータがあれば消す
+  $arr = array();
+  $arr = DBRecord::createRecords(  PROGRAM_TBL, "WHERE starttime  > adddate( now(), 8 )" );
+  foreach( $arr as $val ) $val->delete();
+  
+  // キーワード自動録画予約
+  $arr = array();
+  $arr = Keyword::createKeywords();
+  foreach( $arr as $val ) {
+       try {
+               $val->reservation();
+       }
+       catch( Exception $e ) {
+               // 無視
+       }
+  }
+  exit();
+  
+  function storeProgram( $type, $xmlfile ) {
+       global $BS_CHANNEL_MAP, $GR_CHANNEL_MAP, $CS_CHANNEL_MAP;
+       // チャンネルマップファイルの準備
+       $map = array();
+       if( $type == "BS" ) $map = $BS_CHANNEL_MAP;
+       else if( $type == "GR") $map = $GR_CHANNEL_MAP;
+       else if( $type == "CS") $map = $CS_CHANNEL_MAP;
+       
+       // XML parse
+       $xml = @simplexml_load_file( $xmlfile );
+       if( $xml === false ) {
+               return; // XMLが読み取れないなら何もしない
+       }
+       // channel抽出
+       foreach( $xml->channel as $ch ) {
+               $disc = $ch['id'];
+        try {
+               // チャンネルデータを探す
+               $num = DBRecord::countRecords( CHANNEL_TBL , "WHERE channel_disc = '" . $disc ."'" );
+               if( $num == 0 ) {
+                       // チャンネルデータがないなら新規作成
+                       $rec = new DBRecord( CHANNEL_TBL );
+                       $rec->type = $type;
+                       $rec->channel = $map["$disc"];
+                       $rec->channel_disc = $disc;
+                       $rec->name = $ch->{'display-name'};
+               }
+               else {
+                       // 存在した場合も、とりあえずチャンネル名は更新する
+                       $rec = new DBRecord(CHANNEL_TBL, "channel_disc", $disc );
+                       $rec->name = $ch->{'display-name'};
+               }
+        }
+        catch( Exception $e ) {
+               // 無視
+        }
+       }
+       // channel 終了
+       
+       // programme 取得
+       
+       foreach( $xml->programme as $program ) {
+               $channel_disc = $program['channel']; 
+               $channel = $map["$channel_disc"];
+               $starttime = str_replace(" +0900", '', $program['start'] );
+               $endtime = str_replace( " +0900", '', $program['stop'] );
+               $title = $program->title;
+               $desc = $program->desc;
+               $cat_ja = "";
+               $cat_en = "";
+               foreach( $program->category as $cat ) {
+                       if( $cat['lang'] == "ja_JP" ) $cat_ja = $cat;
+                       if( $cat['lang'] == "en" ) $cat_en = $cat;
+               }
+               $program_disc = md5( $channel_disc . $starttime . $endtime );
+               // printf( "%s %s %s %s %s %s %s \n", $program_disc, $channel, $starttime, $endtime, $title, $desc, $cat_ja );
+               try {
+                // カテゴリを処理する
+                $category_disc = md5( $cat_ja . $cat_en );
+                $num = DBRecord::countRecords(CATEGORY_TBL, "WHERE category_disc = '".$category_disc."'" );
+                $cat_rec = null;
+                if( $num == 0 ) {
+                       // 新規カテゴリの追加
+                       $cat_rec = new DBRecord( CATEGORY_TBL );
+                       $cat_rec->name_jp = $cat_ja;
+                       $cat_rec->name_en = $cat_en;
+                       $cat_rec->category_disc = $category_disc;
+                }
+                else
+                       $cat_rec = new DBRecord(CATEGORY_TBL, "category_disc" , $category_disc );
+                 //
+                $channel_rec = new DBRecord(CHANNEL_TBL, "channel_disc", $channel_disc );
+                $num = DBRecord::countRecords(PROGRAM_TBL, "WHERE program_disc = '".$program_disc."'" );
+                if( $num == 0 ) {
+                       // 新規番組
+                       // 重複チェック 同時間帯にある番組
+                       $options = "WHERE channel_disc = '".$channel_disc."' ".
+                               "AND starttime < '". $endtime ."' AND endtime > '".$starttime."'";
+                       $battings = DBRecord::countRecords(PROGRAM_TBL, $options );
+                       if( $battings > 0 ) {
+                               // 重複発生=おそらく放映時間の変更
+                               $records = DBRecord::createRecords(PROGRAM_TBL, $options );
+                               foreach( $records as $rec ) {
+                                       // 自動録画予約された番組は放映時間変更と同時にいったん削除する
+                                       try {
+                                               $reserve = new DBRecord(RESERVE_TBL, "program_id", $rec->id );
+                                               if( $reserve->autorec ) {
+                                                       Reservation::cancel( $reserve->id );
+                                               }
+                                       }
+                                       catch( Exception $e ) {
+                                               //無視
+                                       }
+                                       // 番組削除
+                                       $rec->delete();
+                               }
+                       }
+                       // //
+                       $rec = new DBRecord( PROGRAM_TBL );
+                       $rec->channel_disc = $channel_disc;
+                       $rec->channel_id = $channel_rec->id;
+                       $rec->type = $type;
+                       $rec->channel = $channel_rec->channel;
+                       $rec->title = $title;
+                       $rec->description = $desc;
+                       $rec->category_id = $cat_rec->id;
+                       $rec->starttime = $starttime;
+                       $rec->endtime = $endtime;
+                       $rec->program_disc = $program_disc;
+                }
+                else {
+                       // 番組内容更新
+                       $rec = new DBRecord( PROGRAM_TBL, "program_disc", $program_disc );
+                       $rec->title = $title;
+                       $rec->description = $desc;
+                       $rec->category_id = $cat_rec->id;
+                }
+               }
+               catch(Exception $e) {
+                       exit( $e->getMessage() );
+               }
+       }
+  }
+?>
\ No newline at end of file