« | »

2012.02.15

epgrecと mediatombの連携について (転記)

うちは pt1で録画したビデオは mediatomb連携を使って PS3で見ているのだけど、mediatombのデフォルトではビデオは全て Video配下に格納されてしまい、録画ファイルが増えてくると目的のファイルを探し出すのが困難になってしまう。PS3の XMBで検索とかフィルタとか指定できれば良いのだが、Firm 3.15ではまだこの機能はない。

そこで、少しでも目的のファイルが探しやすいように録画ファイルのファイル名からチャンネルで分類して mediatombに格納するようにしてみる。

うちの場合、epgrecのファイル命名規則は

%YEAR%%MONTH%%DAY%_%HOUR%%MIN%(%HDURATION%)_%TYPE%%CH%_%TITLE%

ようになっているので(%HDURATION%は %DURATION%を hh:mmの形式に変換したもの)、”_”をデリミタとしてチャンネル情報を取り出してコンテナを作ってやればチャンネルでの分類はできそうな気配。

最初は、recomplete.phpで直接 mediatombのテーブルを操作しようかと考えたがコンテナやオブジェクトはそれぞれ hash値を持っていてこれをエミュレートするのは骨が折れるのと、コンテナ内のオブジェクトが無い時(例えば録画ファイルを削除した場合など)には親コンテナも削除されるようになっているので、エラー処理やら新規の登録が非常に厄介と言うことが判明、この方法は諦める。さらに importは jsのインターフェースしか持っていないので、import.jsで epgrecの Recorder_resevationTBLを読んでコンテナ登録するのは私にはちょっと敷居が高いのでこの方法も使えそうにない….

いろいろ考えあぐね、mediatombのドキュメントの Scriptingを眺めていると “simple structured import script”と言うスクリプトがなんとなく使えそう。
と言うことで、これと recomplete.phpの合わせ技でチャンネルでの分類は何とかできたので忘れないうちに記録しておく(epgrecも mediatombもあちこち触っているので移行の時とかバージョンアップで忘れるととんでもないことになりそうだ)

まずは import.js。書き換える部分は addVideoの function。

function addVideo(obj)
{
    // まず全ての録画ファイルは Video配下の\"All Video\"に格納
    var chain = new Array('Video', 'All Videos');
    addCdsObject(obj, createContainerChain(chain));

    // ファイル名を "_"で分割。前二つの配列(日付と時間)は破棄
    var dir = obj.location.split('_');
    var skip=2;
    var chain = new Array('Video');

    // 3番目の配列で親コンテナを作る
    if(skip;i<=(dir.length-2);i++)
                chain.push(dir[i]);

    addCdsObject(obj, createContainerChain(chain));
}

さて、一応、このままでも Video配下の "All Videos"と "GR24"とか "BS141"とかのコンテナの中に録画ファイルは格納されるはずだが、これだと、イマイチどのチャンネル(NHK,ABC,関テレ...)なのか判りにくい。そこで "GR24"とかの親コンテナをチャンネル名に変更してしまう。幸いなことに mediatombでは一旦作ったコンテナの名前(dc_title)を書き換えても動作には問題がないので recomplete.phpで変換してしまおう。recomplete.phpの

  $sqlstr = "update mt_cds_object set dc_title='".mysql_real_escape_string(preg_replace("/.ts/","",$rrec->path))."' where dc_title='".$rrec->path."'";
  @mysql_query( $sqlstr );

の下あたりに

// type channelをチャンネル名に変換
  $sqlstr = "update mt_cds_object set dc_title=(select name from Recorder_channelTbl where concat(type,channel)='".$rrec->type.$rrec->channel."') where object_type ='1' and dc_title='".$rrec->type.$rrec->channel."'";
  @mysql_query( $sqlstr );

を追加する。
録画ファイルの命名規則はそれぞれ違っているだろうから参考程度にしかならないか。
それにしてももう少しスマートな方法がないものだろうか:-(


さて import.jsと recomplete.phpを変更してもこれが適用されるのは以降に録画したものだけなので、元々の録画ファイルは Video直下に配置されていて気持ち悪いと言う場合は....
Linux系の mediatombではディレクトリの変更を即座に検知するモード inotifyが備わっていて、epgrecのmediatomb連携でもこれの使用が前提となっている。inotifyはファイルの ctimeが変更された瞬間に import.jsとかの処理が走るのでこれを利用して、元々の録画ファイルもチャンネル分類した新しいストラクチャに移行させることができる。やり方は元々の録画ファイルの ctimeを更新してやればいいのでスプールのディレクトリで

find ./ -name "*.ts" -exec touch {} \;

これでディレクトリ内の .ファイルの ctimeが一度に書き換わるので import.jsが走る。チャンネルは GR24とかのままだけど、対象チャンネルの番組を録画した時に勝手に書き換わるのでそのままでも良い。すぐに書き換えてしまいたい向きは DBに繋いで

update mt_cds_object set dc_title=(select name from Recorder_channelTbl where concat(type,channel)='GR24') where object_type='1' and dc_title='GR24'

とかで各チャンネルコンテナを書き換えてしまえば良い。mediatombの WEB UIで書き換えることもできるが、2byte文字は urlencodeされて DBに格納されるので DBを直接見たり触ったりする時にちょっと見難くなる。


さて、チャンネルでビデオを分類するだけでも XBMとかでも随分と操作しやすくなったが、例えば寝る前や風呂で今日のニュースを続けて見たいとかの時には ALL Videoフォルダで下の方までスクロールするかチャンネルフォルダを渡り歩かないといけない。ALL Videoフォルダに100本も200本もビデオが溜まっていると、とてもじゃないけど今日のニュースなんかちょっと見たいだけなのに探す気にもならない。特に PS3や androidなどの DLNA/UPnPクライアントでは録画リストをソートやフィルタできないので大変だ。
今見れないからちょっと録画しておいて、その日のうちに見る、こう言うシチュエーションは結構あるのではないだろうか?
ではどうするか。最近録画したビデオとかのフォルダがあれば手っ取り早い。と言うことで AllVideoフォルダに直近の2週間、直近の4週間というフォルダを作ってビデオをそこに格納しよう。先ほどの import.jsにもう少し手を入れて

>function addVideo(obj)
{
    var chain = new Array('Video', 'All Videos');
    addCdsObject(obj, createContainerChain(chain));

    var chain = new Array('Video', 'All Videos', 'Recent 2weeks');
    addCdsObject(obj, createContainerChain(chain));

    var chain = new Array('Video', 'All Videos', 'Recent 4weeks');
    addCdsObject(obj, createContainerChain(chain));

    var dir = obj.location.split('_');
    var skip=2;
    var chain = new Array('Video');

    if(skip <= dir.length-2)
        for(i=skip;i<=(dir.length-2);i++)
                chain.push(dir[i]);

    addCdsObject(obj, createContainerChain(chain));
}

当然、2週間/4週間以上経ったビデオは直近の録画フォルダからは消えてもらわないといけないので、お掃除する SQLを作って1日一回 cronなりでまわして消してしまおう。
cleanup_recent_data_from_mtcdsobject.sql

delete from mt_cds_object where object_type=2 and parent_id=11331 and timestamp < CURDATE() - INTERVAL 28 DAY;
delete from mt_cds_object where object_type=2 and parent_id=11329 and timestamp < CURDATE() - INTERVAL 14 DAY;

parent_idはそれぞれの環境に合わせること
crontab

0 0 * * * mysql -u (dbuser) -p(password) (dbname) < cleanup_recent_data_from_mtcdsobject.sql

(dbuser)(password)(dbname)はそれぞれの環境に合わせること。
これで All Videoフォルダの中に最近の2週間/4週間のフォルダができてビデオが格納されているので、ちょいと見たいものはここから探せば早い。

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
:-[ (B) (^) (P) (@) (O) (D) :-S ;-( (C) (&) :-$ (E) (~) (K) (I) (L) (8) :-O (T) (G) (F) :-( (H) :-) (*) :-D (N) (Y) :-P (U) (W) ;-)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)