Mercurial > epgrec.yaz
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 ) { |