epgrecUNAに容量不足時自動削除機能を追加

 epgrecUNAはEPGStation等と違い、録画先の容量が不足した場合に古い番組から自動的に削除する機能が無いので、少しでもメンテナンスを忘れて放置するとシステムが動かなくなったりして面倒なので、何とかそういう機能を付けられないかと最近また四苦八苦していた。
 削除は録画済一覧から行えるし、録画済一覧には現在の空き容量も表示されているので、ここをヒントにどういう処理を行えばいいかをPHPも知らないのに調べてみた。
 録画済一覧はrecordedTable.phpだが、画面構成などのHTMLに相当する部分はtemplates/recordedTable.htmlに書かれている。これはSmartyってエンジンで1つに合わさって動作する仕組みになっているらしい。あと、recordedTable.phpから使われている主要な処理のいくつかがreclib.phpに記述されていた。
 結果、recordedTable.phpにある一括削除処理にreclib.phpの空き容量確認処理を組み入れて10GB未満だったら削除を続けるロジックを作り、これを録画直前に動作するscoutEpg.phpの最初の処理として組み込んでみたところ、上手く動作しているっぽい。やっと長年の課題が解決した。
 この機能を追加するには、config.phpのdefine( 'STREAMURL_INC_PW', FALSE );の下あたりにdefine( 'STORAGE_LIMIT', 21474836480 );のように最低確保容量を指定(この例では20GB)し、scoutEpg.phpの先頭部分にある$settings = Settings::factory();の下あたりに以下の内容を追加するだけ。

$rev_obj = new DBRecord( RESERVE_TBL );

$act_trans = array_key_exists( 'tsuffix', end($RECORD_MODE) );
if( $act_trans )
        $trans_obj = new DBRecord( TRANSCODE_TBL );

$del_list    = $rev_obj->fetch_array( null, null, 'complete=1 ORDER BY starttime' );

foreach( $del_list as $rec ){
        // 空き容量不足時ファイル削除
        if( disk_free_space( INSTALL_PATH.$settings->spool ) < STORAGE_LIMIT ) {
                // トラコンファイル削除
                if( $act_trans ){
                        $del_trans = $trans_obj->fetch_array( null, null, 'rec_id='.$rec['id'].' ORDER BY status' );
                        foreach( $del_trans as $del_file ){
                                switch( $del_file['status'] ){
                                        case 1:         // 処理中(0は処理済)
                                                $ps_output = shell_exec( PS_CMD );
                                                $rarr      = explode( "\n", $ps_output );
                                                killtree( $rarr, (int)$del_file['pid'] );
                                                sleep(1);
                                                break;
                                        case 2:         // 正常終了
                                        case 3:         // 異常終了
                                                if( file_exists( $del_file['path'] ) )
                                                        @unlink( $del_file['path'] );
                                                break;
                                }
                                $trans_obj->force_delete( $del_file['id'] );
                        }
                }
                // ファイルを削除
                $reced = INSTALL_PATH.$settings->spool.'/'.$rec['path'];
                if( file_exists( $reced ) )
                        @unlink( $reced );
                // サムネイル削除
                $thumbs = INSTALL_PATH.$settings->thumbs.'/'.end(explode( '/', $rec['path'] )).'.jpg';
                if( file_exists( $thumbs ) )
                        @unlink( $thumbs );

                // 予約取り消し実行
                try {
                        $ret_code = Reservation::cancel( $rec['id'], 0 );
                }catch( Exception $e ){
                        // 無視
                }
        }
}

 定時後、第二神明で帰宅。母親が壁時計の電池交換を頼んできた。何とか交換する電池は足りたものの、予備が全然無い状態なので買ってくれとのこと。せっかくなので、買おうと思っていたパーツなども一緒に注文。

AINEX シリアルATA用電源延長ケーブル [ 30cm ] SA-047SA

AINEX シリアルATA用電源延長ケーブル [ 30cm ] SA-047SA

 晩御飯は肉じゃがとおあげとじゃがいもの味噌汁。
 母親の知人KMからPCで上手くできないことがあるってことで母親と共に伺いに行く。まずは無線LAN接続の複合機PIXUS TS5030を使えるようにドライバのセットアップから。上手くできなかった理由はネットワーク上に見つかったプリンタにチェックマークを入れなければならないのが特に説明されてなくて、どうすればいいか分からず次に進めなかったことだった。無事完了。
 次はFacebookのページを何故かローカル保存したものを開いて投稿ができないと言うので、ブックマークした上で、それを開く方法を説明。
 今度はスキャンしたものを投稿しようとしたが、キャノンのクイックランチャーにあるものはPDFでしかスキャンできないっぽい。他にソフトはあるらしいが、面倒なのでWindows標準のFAXとスキャンの使い方を教える。これでJPEGファイルで取り込めたので投稿も出来た。
 最後に年賀状印刷ソフトを入れようとしたが途中でくじけたっぽい。郵便局のはがきデザインキットのインストール版を入れようとしたら、Flash Playerが既にChromeではブロックされていてページが使えない罠。どんだけ古いねん、郵便局は。
 幸いにも別のインストール方法ってページがあったので、そちらに従ってAdobe AIRをまずはダウンロード。ここでダウンロードした後、Web上ではAdobeが別の画面へと誘導しようとして怪しいと思い、閉じてしまったらしい。ダウンロードされたら無視して、ダウンロードされたものを実行してインストールすればいいと教えて問題なく終了。
 続いて、はがきデザインキットを同様にダウンロードして開いて実行してインストール。無事出来上がり。軽く使い方を説明して本日は終了。途中、お茶も出してもらって、帰る前に余ったお茶菓子も頂いた。そして、夜10時頃帰宅。
 帰宅後に母親に今日買うって言うてた電池とかの注文をさせる。こちらも無事終了。