comparison Reservation.class.php @ 75:11f63ae04a96

delete trailing white space
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sun, 14 Feb 2010 17:01:02 +0900
parents 29131bd8dea3
children 36ac7c416bd7
comparison
equal deleted inserted replaced
74:fce37385c8b4 75:11f63ae04a96
6 6
7 7
8 // 予約クラス 8 // 予約クラス
9 9
10 class Reservation { 10 class Reservation {
11 11
12 public static function simple( $program_id , $autorec = 0, $mode = 0) { 12 public static function simple( $program_id , $autorec = 0, $mode = 0) {
13 $settings = Settings::factory(); 13 $settings = Settings::factory();
14 $rval = 0; 14 $rval = 0;
15 try { 15 try {
16 $prec = new DBRecord( PROGRAM_TBL, "id", $program_id ); 16 $prec = new DBRecord( PROGRAM_TBL, "id", $program_id );
17 17
18 $rval = self::custom( 18 $rval = self::custom(
19 $prec->starttime, 19 $prec->starttime,
20 $prec->endtime, 20 $prec->endtime,
21 $prec->channel_id, 21 $prec->channel_id,
22 $prec->title, 22 $prec->title,
23 $prec->description, 23 $prec->description,
24 $prec->category_id, 24 $prec->category_id,
25 $program_id, 25 $program_id,
26 $autorec, 26 $autorec,
27 $mode ); 27 $mode );
28 28
29 } 29 }
30 catch( Exception $e ) { 30 catch( Exception $e ) {
31 throw $e; 31 throw $e;
32 } 32 }
33 return $rval; 33 return $rval;
34 } 34 }
35 35
36 public static function custom( 36 public static function custom(
37 $starttime, // 開始時間Datetime型 37 $starttime, // 開始時間Datetime型
38 $endtime, // 終了時間Datetime型 38 $endtime, // 終了時間Datetime型
39 $channel_id, // チャンネルID 39 $channel_id, // チャンネルID
40 $title = "none", // タイトル 40 $title = "none", // タイトル
48 $settings = Settings::factory(); 48 $settings = Settings::factory();
49 49
50 // 時間を計算 50 // 時間を計算
51 $start_time = toTimestamp( $starttime ); 51 $start_time = toTimestamp( $starttime );
52 $end_time = toTimestamp( $endtime ) + $settings->extra_time; 52 $end_time = toTimestamp( $endtime ) + $settings->extra_time;
53 53
54 if( $start_time < (time() + PADDING_TIME + 10) ) { // 現在時刻より3分先より小さい=すでに開始されている番組 54 if( $start_time < (time() + PADDING_TIME + 10) ) { // 現在時刻より3分先より小さい=すでに開始されている番組
55 $start_time = time() + PADDING_TIME + 10; // 録画開始時間を3分10秒先に設定する 55 $start_time = time() + PADDING_TIME + 10; // 録画開始時間を3分10秒先に設定する
56 } 56 }
57 $at_start = $start_time - PADDING_TIME; 57 $at_start = $start_time - PADDING_TIME;
58 $sleep_time = PADDING_TIME - $settings->former_time; 58 $sleep_time = PADDING_TIME - $settings->former_time;
59 $rec_start = $start_time - $settings->former_time; 59 $rec_start = $start_time - $settings->former_time;
60 60
61 // durationを計算しておく 61 // durationを計算しておく
62 $duration = $end_time - $rec_start; 62 $duration = $end_time - $rec_start;
63 if( $duration < ($settings->former_time + 60) ) { // 60秒以下の番組は弾く 63 if( $duration < ($settings->former_time + 60) ) { // 60秒以下の番組は弾く
64 throw new Exception( "終わりつつある/終わっている番組です" ); 64 throw new Exception( "終わりつつある/終わっている番組です" );
65 } 65 }
66 66
67 $rrec = null; 67 $rrec = null;
68 try { 68 try {
69 // 同一番組予約チェック 69 // 同一番組予約チェック
70 if( $program_id ) { 70 if( $program_id ) {
71 $num = DBRecord::countRecords( RESERVE_TBL, "WHERE program_id = '".$program_id."'" ); 71 $num = DBRecord::countRecords( RESERVE_TBL, "WHERE program_id = '".$program_id."'" );
72 if( $num ) { 72 if( $num ) {
73 throw new Exception("同一の番組が録画予約されています"); 73 throw new Exception("同一の番組が録画予約されています");
74 } 74 }
75 } 75 }
76 76
77 $crec = new DBRecord( CHANNEL_TBL, "id", $channel_id ); 77 $crec = new DBRecord( CHANNEL_TBL, "id", $channel_id );
78 78
79 // 既存予約数 = TUNER番号 79 // 既存予約数 = TUNER番号
80 $tuners = ($crec->type == "GR") ? $settings->gr_tuners : $settings->bs_tuners; 80 $tuners = ($crec->type == "GR") ? $settings->gr_tuners : $settings->bs_tuners;
81 $battings = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ". 81 $battings = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ".
82 "AND type = '".$crec->type."' ". 82 "AND type = '".$crec->type."' ".
83 "AND starttime < '".toDatetime($end_time) ."' ". 83 "AND starttime < '".toDatetime($end_time) ."' ".
84 "AND endtime > '".toDatetime($rec_start)."'" 84 "AND endtime > '".toDatetime($rec_start)."'"
85 ); 85 );
86 86
87 if( $battings >= $tuners ) { 87 if( $battings >= $tuners ) {
88 // 重複を発見した 88 // 重複を発見した
89 if( $settings->force_cont_rec == 1 ) { 89 if( $settings->force_cont_rec == 1 ) {
90 // 解消可能な重複かどうかを調べる 90 // 解消可能な重複かどうかを調べる
91 // 前後の予約数 91 // 前後の予約数
92 $nexts = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ". 92 $nexts = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ".
93 "AND type = '".$crec->type."' ". 93 "AND type = '".$crec->type."' ".
94 "AND starttime = '".toDatetime($end_time - $settings->former_time)."'"); 94 "AND starttime = '".toDatetime($end_time - $settings->former_time)."'");
95 95
96 $prevs = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ". 96 $prevs = DBRecord::countRecords( RESERVE_TBL, "WHERE complete = '0' ".
97 "AND type = '".$crec->type."' ". 97 "AND type = '".$crec->type."' ".
98 "AND endtime = '".$starttime."'" ); 98 "AND endtime = '".$starttime."'" );
99 99
100 // 前後を引いてもチューナー数と同数以上なら重複の解消は無理 100 // 前後を引いてもチューナー数と同数以上なら重複の解消は無理
101 if( ($battings - $nexts - $prevs) >= $tuners ) 101 if( ($battings - $nexts - $prevs) >= $tuners )
102 throw new Exception( "重複予約を解消できません" ); 102 throw new Exception( "重複予約を解消できません" );
103 103
104 // 直後の番組はあるか? 104 // 直後の番組はあるか?
105 if( $nexts ) { 105 if( $nexts ) {
106 // この番組の終わりをちょっとだけ早める 106 // この番組の終わりをちょっとだけ早める
107 $end_time = $end_time - $settings->former_time - $settings->rec_switch_time; 107 $end_time = $end_time - $settings->former_time - $settings->rec_switch_time;
108 $duration = $end_time - $rec_start; // durationを計算しなおす 108 $duration = $end_time - $rec_start; // durationを計算しなおす
109 } 109 }
110 $battings -= $nexts; 110 $battings -= $nexts;
111 111
112 // 直前の録画予約を見付ける 112 // 直前の録画予約を見付ける
113 $trecs = DBRecord::createRecords(RESERVE_TBL, "WHERE complete = '0' ". 113 $trecs = DBRecord::createRecords(RESERVE_TBL, "WHERE complete = '0' ".
114 "AND type = '".$crec->type."' ". 114 "AND type = '".$crec->type."' ".
115 "AND endtime = '".$starttime."'" ); 115 "AND endtime = '".$starttime."'" );
116 // 直前の番組をずらす 116 // 直前の番組をずらす
125 $prev_category_id = $trecs[$i]->category_id; 125 $prev_category_id = $trecs[$i]->category_id;
126 $prev_starttime = $trecs[$i]->starttime; 126 $prev_starttime = $trecs[$i]->starttime;
127 $prev_endtime = $trecs[$i]->endtime; 127 $prev_endtime = $trecs[$i]->endtime;
128 $prev_autorec = $trecs[$i]->autorec; 128 $prev_autorec = $trecs[$i]->autorec;
129 $prev_mode = $trecs[$i]->mode; 129 $prev_mode = $trecs[$i]->mode;
130 130
131 $prev_start_time = toTimestamp($prev_starttime); 131 $prev_start_time = toTimestamp($prev_starttime);
132 // 始まっていない予約? 132 // 始まっていない予約?
133 if( $prev_start_time > (time() + PADDING_TIME + $settings->former_time) ) { 133 if( $prev_start_time > (time() + PADDING_TIME + $settings->former_time) ) {
134 // 開始時刻を元に戻す 134 // 開始時刻を元に戻す
135 $prev_starttime = toDatetime( $prev_start_time + $settings->former_time ); 135 $prev_starttime = toDatetime( $prev_start_time + $settings->former_time );
136 // 終わりをちょっとだけずらす 136 // 終わりをちょっとだけずらす
137 $prev_endtime = toDatetime( toTimestamp($prev_endtime) - $settings->former_time - $settings->rec_switch_time ); 137 $prev_endtime = toDatetime( toTimestamp($prev_endtime) - $settings->former_time - $settings->rec_switch_time );
138 138
139 // tryのネスト 139 // tryのネスト
140 try { 140 try {
141 // いったん予約取り消し 141 // いったん予約取り消し
142 self::cancel( $prev_id ); 142 self::cancel( $prev_id );
143 // 再予約 143 // 再予約
144 self::custom( 144 self::custom(
145 $prev_starttime, // 開始時間Datetime型 145 $prev_starttime, // 開始時間Datetime型
146 $prev_endtime, // 終了時間Datetime型 146 $prev_endtime, // 終了時間Datetime型
147 $prev_channel_id, // チャンネルID 147 $prev_channel_id, // チャンネルID
148 $prev_title, // タイトル 148 $prev_title, // タイトル
149 $prev_description, // 概要 149 $prev_description, // 概要
168 throw new Exception( "重複予約があります" ); 168 throw new Exception( "重複予約があります" );
169 } 169 }
170 } 170 }
171 // チューナー番号 171 // チューナー番号
172 $tuner = $battings; 172 $tuner = $battings;
173 173
174 // 改めてdurationをチェックしなおす 174 // 改めてdurationをチェックしなおす
175 if( $duration < ($settings->former_time + 60) ) { // 60秒以下の番組は弾く 175 if( $duration < ($settings->former_time + 60) ) { // 60秒以下の番組は弾く
176 throw new Exception( "終わりつつある/終わっている番組です" ); 176 throw new Exception( "終わりつつある/終わっている番組です" );
177 } 177 }
178 178
179 179
180 // ここからファイル名生成 180 // ここからファイル名生成
181 /* 181 /*
182 %TITLE% 番組タイトル 182 %TITLE% 番組タイトル
183 %ST% 開始日時(ex.200907201830) 183 %ST% 開始日時(ex.200907201830)
184 %ET% 終了日時 184 %ET% 終了日時
195 %DURATION% 録画時間(秒) 195 %DURATION% 録画時間(秒)
196 */ 196 */
197 197
198 $day_of_week = array( "日","月","火","水","木","金","土" ); 198 $day_of_week = array( "日","月","火","水","木","金","土" );
199 $filename = $settings->filename_format; 199 $filename = $settings->filename_format;
200 200
201 // あると面倒くさそうな文字を全部_に 201 // あると面倒くさそうな文字を全部_に
202 $fn_title = mb_ereg_replace("[ \./\*:<>\?\\|()\'\"&]","_", trim($title) ); 202 $fn_title = mb_ereg_replace("[ \./\*:<>\?\\|()\'\"&]","_", trim($title) );
203 203
204 // %TITLE% 204 // %TITLE%
205 $filename = str_replace("%TITLE%", $fn_title, $filename); 205 $filename = str_replace("%TITLE%", $fn_title, $filename);
206 // %ST% 開始日時 206 // %ST% 開始日時
207 $filename = str_replace("%ST%",date("YmdHis", $start_time), $filename ); 207 $filename = str_replace("%ST%",date("YmdHis", $start_time), $filename );
208 // %ET% 終了日時 208 // %ET% 終了日時
227 $filename = str_replace("%MIN%",date("i", $start_time), $filename ); 227 $filename = str_replace("%MIN%",date("i", $start_time), $filename );
228 // %SEC% 開始秒 228 // %SEC% 開始秒
229 $filename = str_replace("%SEC%",date("s", $start_time), $filename ); 229 $filename = str_replace("%SEC%",date("s", $start_time), $filename );
230 // %DURATION% 録画時間(秒) 230 // %DURATION% 録画時間(秒)
231 $filename = str_replace("%DURATION%","".$duration, $filename ); 231 $filename = str_replace("%DURATION%","".$duration, $filename );
232 232
233 // 文字コード変換 233 // 文字コード変換
234 if( defined("FILESYSTEM_ENCODING") ) { 234 if( defined("FILESYSTEM_ENCODING") ) {
235 $filename = mb_convert_encoding( $filename, FILESYSTEM_ENCODING, "UTF-8" ); 235 // $filename = mb_convert_encoding( $filename, FILESYSTEM_ENCODING, "UTF-8" );
236 $filename = mb_convert_encoding( $filename, FILESYSTEM_ENCODING, "auto" );
236 } 237 }
237 $filename .= $RECORD_MODE[$mode]['suffix']; 238 $filename .= $RECORD_MODE[$mode]['suffix'];
238 $thumbname = $filename.".jpg"; 239 $thumbname = $filename.".jpg";
239 240
240 // サムネール 241 // サムネール
241 $gen_thumbnail = INSTALL_PATH."/gen-thumbnail.sh"; 242 $gen_thumbnail = INSTALL_PATH."/gen-thumbnail.sh";
242 if( defined("GEN_THUMBNAIL") ) 243 if( defined("GEN_THUMBNAIL") )
243 $gen_thumbnail = GEN_THUMBNAIL; 244 $gen_thumbnail = GEN_THUMBNAIL;
244 245
245 // ファイル名生成終了 246 // ファイル名生成終了
246 247
247 // 予約レコードを埋める 248 // 予約レコードを埋める
248 $rrec = new DBRecord( RESERVE_TBL ); 249 $rrec = new DBRecord( RESERVE_TBL );
249 $rrec->channel_disc = $crec->channel_disc; 250 $rrec->channel_disc = $crec->channel_disc;
250 $rrec->channel_id = $crec->id; 251 $rrec->channel_id = $crec->id;
251 $rrec->program_id = $program_id; 252 $rrec->program_id = $program_id;
258 $rrec->endtime = toDatetime( $end_time ); 259 $rrec->endtime = toDatetime( $end_time );
259 $rrec->path = $filename; 260 $rrec->path = $filename;
260 $rrec->autorec = $autorec; 261 $rrec->autorec = $autorec;
261 $rrec->mode = $mode; 262 $rrec->mode = $mode;
262 $rrec->reserve_disc = md5( $crec->channel_disc . toDatetime( $start_time ). toDatetime( $end_time ) ); 263 $rrec->reserve_disc = md5( $crec->channel_disc . toDatetime( $start_time ). toDatetime( $end_time ) );
263 264
264 // 予約実行 265 // 予約実行
265 $cmdline = $settings->at." ".date("H:i m/d/Y", $at_start); 266 $cmdline = $settings->at." ".date("H:i m/d/Y", $at_start);
266 $descriptor = array( 0 => array( "pipe", "r" ), 267 $descriptor = array( 0 => array( "pipe", "r" ),
267 1 => array( "pipe", "w" ), 268 1 => array( "pipe", "w" ),
268 2 => array( "pipe", "w" ), 269 2 => array( "pipe", "w" ),
275 "MODE" => $mode, 276 "MODE" => $mode,
276 "THUMB" => INSTALL_PATH.$settings->thumbs."/".$thumbname, 277 "THUMB" => INSTALL_PATH.$settings->thumbs."/".$thumbname,
277 "FORMER" => "".$settings->former_time, 278 "FORMER" => "".$settings->former_time,
278 "FFMPEG" => "".$settings->ffmpeg, 279 "FFMPEG" => "".$settings->ffmpeg,
279 ); 280 );
280 281
281 // ATで予約する 282 // ATで予約する
282 $process = proc_open( $cmdline , $descriptor, $pipes, INSTALL_PATH.$settings->spool, $env ); 283 $process = proc_open( $cmdline , $descriptor, $pipes, INSTALL_PATH.$settings->spool, $env );
283 if( is_resource( $process ) ) { 284 if( is_resource( $process ) ) {
284 fwrite($pipes[0], $settings->sleep." ".$sleep_time."\n" ); 285 fwrite($pipes[0], $settings->sleep." ".$sleep_time."\n" );
285 fwrite($pipes[0], DO_RECORD . "\n" ); 286 fwrite($pipes[0], DO_RECORD . "\n" );
288 fwrite($pipes[0], $gen_thumbnail."\n" ); 289 fwrite($pipes[0], $gen_thumbnail."\n" );
289 } 290 }
290 fclose($pipes[0]); 291 fclose($pipes[0]);
291 // 標準エラーを取る 292 // 標準エラーを取る
292 $rstring = stream_get_contents( $pipes[2]); 293 $rstring = stream_get_contents( $pipes[2]);
293 294
294 fclose( $pipes[2] ); 295 fclose( $pipes[2] );
295 proc_close( $process ); 296 proc_close( $process );
296 } 297 }
297 else { 298 else {
298 $rrec->delete(); 299 $rrec->delete();
325 } 326 }
326 throw $e; 327 throw $e;
327 } 328 }
328 } 329 }
329 // custom 終了 330 // custom 終了
330 331
331 // 取り消し 332 // 取り消し
332 public static function cancel( $reserve_id = 0, $program_id = 0 ) { 333 public static function cancel( $reserve_id = 0, $program_id = 0 ) {
333 $settings = Settings::factory(); 334 $settings = Settings::factory();
334 $rec = null; 335 $rec = null;
335 336
336 try { 337 try {
337 if( $reserve_id ) { 338 if( $reserve_id ) {
338 $rec = new DBRecord( RESERVE_TBL, "id" , $reserve_id ); 339 $rec = new DBRecord( RESERVE_TBL, "id" , $reserve_id );
339 } 340 }
340 else if( $program_id ) { 341 else if( $program_id ) {