事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop
意味の分からんタイトルですが。
EPGrecで放送中の番組を予約すると、約3分後から録画が始まる。というのは多分EPGrecを使い始めるとすぐにそういう仕様なんだと理解すると思う。が、それをキャンセルしたときのお話。

条件
When:放送開始時間後に
What:その放送の録画予約をし、そこから10秒以内にその録画をキャンセルすると

現象
1:予約は削除される
2:が、3分後に録画が開始されて、しかも予約一覧にも録画一覧にも表示されない
3:HDDには録画されたものが出来上がる

なぜこんなことになるか?
EPGrecは録画予約の実行にatを使っている。
Reservation.class.phpの279行あたりでatによる予約をしている。)
が、atは秒単位の指定は出来ない。
(ので、実際の録画開始はrecorder.phpの200行あたりでwhileとusleepを使って秒単位のpendingを掛けている。)

Reservation.class.phpの61行あたりで既に開始されている番組だと、
$start_time = time() + PADDING_TIME + 10;	// 録画開始時間を3分10秒先に設定する
今の時間から3分(PADDING_TIME)+10秒後に録画が始まるようにしてある。

そして、64行目で
$at_start = $start_time - PADDING_TIME;
atの開始時間を、録画開始の3分前(PADDING_TIME)になるようになっている。
atが秒を理解すれば、これでも予約をしてすぐにatは走らない(10秒間は)が、atは秒を理解しないので、大概の場合放送中の番組を予約すると即座にatが走る。
例えば、01:10:23に既に始まってる放送を録画予約する。
        ↓
録画開始時間を01:13:33とし、atの開始時間を01:13:23としてatに登録する。
        ↓
が、atは秒を理解しないのでatには01:13が自分の開始時間(既に始まっている)と解釈し即スタート

で、atが走るとatがrecorder.phpを動かして、$starttime(Reservation.class.phpの$start_timeとほぼ同じ)待ちになる(約3分後に録画開始)

さらに、ここでこの予約のキャンセルをすると、Reservation.class.php
361行目cancel関数で
if( toTimestamp($rec->starttime) < (time() + PADDING_TIME + $settings->former_time) )

録画開始時間が、現在時刻(time())+3分(PADDING_TIME)+録画開始の余裕時間(秒)($settings->former_time)※
よりも早い(=録画が既に始まっている)ことで場合分けをし、
録画開始後ならrecorder.phpの動作を止め予約をキャンセルしようとする。
録画開始以前ならrecorder.phpは動いていない“はず”なので、単にatを削除し、MySQLのRecorde_reserveTblの予約を削除して終わっている。
(ここには10秒が加算されていない)
(※$rec->starttimeはMySQLの予約テーブル上の開始時間で$settings->former_timeが考慮されている。
$start_timeは番組表テーブル上の開始時間で$settings->former_timeは含まれていない。
本題とは無関係)


で、
atが秒を理解していれば、放送中の番組を予約録画し、10秒以内にキャンセルしてもこれでいいのだけれど、atは秒を理解しないので、これをやると、Reservation.class.phpのcancel関数ではまだ録画が始まっていないと判定されるのに、すでにatは走っていて、recorder.phpも走っている。ので、正常に予約録画はキャンセルされたように見えるのに、3分後には録画が始まってしまう。しかも、atが走ったあとにatが削除され(atが削除されてもrecorder.phpは止まらない)、MySQLのRecorde_reserveTblの予約情報も消えているので、予約一覧からも、録画済一覧からも見れない。


対策?
10秒はおそらく予約の処理のための余裕時間なのだろう。
これをなくせばいいという問題でもないし、他に10秒足せばいいという問題でもない。(通常の予約の時誤判定を起こす)
なので、これは根本対策をするのがベストで、
Reservation.class.phpで、放送開始後と判定されたら、以降は通常の予約と同じ手段をとらずに即座にdo-record.shをたたいて、MySQLには別個に録画予約を登録するのがいいと思う。
そうすれば、3分の待ち時間もなくなるし、この問題もなくなる。
当然後に控えてる予約とバッティングしないかをチェックしなきゃいけないのは現状と同じで、その処理はサブルーチン化されてないから書き起こす(コピペる)必要がある。次の予約までのDurationで撮るとかも当然可能だけど、どの道ちょっとしたtipsレベルではなくちょっとした改造になる。

と、いう所でそれをやるかどうかは・・・・・・
とりあえず、謎動作の原因が分かったので、メモ

EPGrecはLinux + PTxで一番使用者が多いと思うし、公開から数年たってるのでそこそこ枯れてるかと思ったのに、結構穴ぼこが多いなぁ;;
自動録画予約でも録画開始時間と放送時間変更とEPG更新のタイミングしだいでは録画失敗が起こりうるコードになってる。と思われる。
storeProgram.inc.phpの160行目とgetepg.phpの134行目のdoKeywordReservation();のタイミング参照
この間に放送開始だと録画されない。よね?
放送開始時間が頻繁に変更されるんhkで35分あたりから開始する番組で起こりうるのではないだろうか・・・
まだこの事象にはあってないけど。

しかし、ソースを見だしたら色々といじってしまった。メンテナンスが苦労するなぁ。。
スポンサーサイト

PageTop

コメント

 ※
 ※
管理者にだけ表示を許可する
  ※ 必須項目です

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。