recfriio server
バージョン 0.5.1
ライセンス GPL3 (c) 2009 recfriio server project
開発環境 ubuntu8.04 + apache2.28 + php5.2.4 / fedora7 + apache2.2.6 + php5.2.2
動作確認したwebブラウザ firefox3(ubuntu8.04) / firefox2(fedora7) / IE6(winXP) / IE6(win2000) / IE8beta(win7beta)
動作確認したデバイス HDUS、HDUSF


recfriio server は recfriio を webブラウザから制御するためのサーバでapache+PHP5の環境で動作します。

セキュリティの事とかはあまりきちんと考えていないので外には公開しない方が良いです。 また何があっても責任取りませんので使用は自己責任でお願いします。

なお、HDUSとHDUSFしか持っていないのでfriioとの混在環境ではうまく動作しないかもしれません。
[1] 使い方
web ブラウザで recfriio.php にアクセスする。あとはチャンネルとか録画時間をセットして視聴、又は録画ボタンを押すだけ。

視聴と録画の違いはファイルを保存するかどうかだけで、視聴のみならファイル名は指定しなくても良い。 上書きしないをチェックするとファイル名の後ろに日付を入れる。 なお、UDP送信機能は HDUS パッチを当てた recfriio でないと機能しないので注意。

recfriioを起動すると動作状況画面に状況が表示される。停止ボタンを押すと停止する。

なおvlc等で視聴した後に「停止」ボタンを押し忘れることが良くあるのでorz、時間は 10時間とか長めにセットしないで番組の長さ分だけにしておくと自動で停止するので安全。
[2] recfriio の設定
recfriio を apache が操作できるようにする。なお以下の説明は ubuntu(debian)での設定方法でありRH系の場合は若干設定方法が違うので注意。 特に www-data というユーザ名は RH系のサーバの場合は apache に読み替えること。
(1) video グループに www-data( apache ) を登録

video グループが無ければ 

$ sudo groupadd video

で作成し、

$ sudo gpasswd -a www-data video

でグループに追加。ついでに自分のアカウントも video グループに追加する
例えば自分が foo ならば

$ sudo gpasswd -a www-data foo

追加されたか確認

$ grep video /etc/group
video:x:44:foo,www-data

apache を再起動しないとグループファイルの変更が反映されないので注意 !  ( ハマった orz )

$ sudo /etc/init.d/apache2 restart


(2) recfriioが使うロックファイルのパーミッション設定

/var/lock/friiodetect

が無ければ

$ touch /var/lock/friiodetect

で作成してから

$ chmod 664 /var/lock/friiodetect
$ sudo chown 
$ sudo chown www-data:video /var/lock/friiodetect

正しく設定されたか確認

$ ls -al /var/lock/friiodetect 
-rw-rw-r-- 1 foo video 0 2009-01-10 14:25 /var/lock/friiodetect


(3) USBのパーミッション設定

/etc/udev/rules.d/40-permissions.rules に


# HDUS
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \
	ATTRS{idVendor}=="3275", ATTRS{idProduct}=="6051", \
	MODE="0664", GROUP="video"

# friio
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \
	ATTRS{idVendor}=="7a69", ATTRS{idProduct}=="0001", \
	MODE="0664", GROUP="video"


を追加する。その後HDUSかfriioを差しHDUSなら更に as11loader を実行したらパーミッションが正しく
設定されているか確認する。例えば

$ lsusb
Bus 003 Device 006: ID 3275:6051  

と表示されたら /dev/bus/usb/003/006 のパーミッションを調べて

$ ls -al /dev/bus/usb/003/006
crw-rw-r-- 1 root video 189, 261 2009-01-10 12:59 /dev/bus/usb/003/006

と、グループが video となっていれば良い


(4) 動作確認

recfriio が video グループに属するユーザから動かせるか確認
うまく起動したら Ctrl+c ( kill -INT ) で正常に終了するか確認する

$ recfriio --hdus 25 10 /dev/null
Tuner type is HDUS.
Search friios from dir: /dev/bus/usb
1 friios found:
/dev/bus/usb/003/006: use this friio.
device: /dev/bus/usb/003/006
opening HDUS...done.
freq = 545
CNR: 25.704
Signal level: 49.2855
Output ts file.
sync 158 bytes
sync 128 bytes
done.
Rec time: 9.179645 sec.
CNR: 25.6313
Signal level: 49.1446
closing HDUS...done.

[3] recfriio server の設定
(1) 適切な場所(例えば /var/www)に展開してディレクトリのパーミッションを設定

モードはapacheの設定によって違うので適当に変えること
展開したら recfriio ディレクトリが出きるので 

$ chmod 755 recfriio
$ cd recfriio



(2) 設定ファイルとチャンネル設定ファイルを編集する

設定ファイル( config.php ) の内、「以下の項目は必要に応じて設定」と書いてある行よりも
上にある設定は必ず設定する。詳しくは設定ファイルのコメントに書いてある。

チャンネル設定ファイル( config-channelmap.php ) の書式は "チャンネル" => "局名"

iEPGを使用する場合は iEPG で取得される局名(station)に名前を合わせる( 半角と全角の違いは無視する )。



(3) 作業用ディレクトリとキャッシュディレクトリを作成してパーミッション設定

どちらもconfig.php の HOME で指定したディレクトリの下に作る

作業ディレクトリ名前は config.php の VARDIR で変更可能
デフォルトは var

$ mkdir var
$ chgrp video var
$ chmod 775 var


キャッシュディレクトリ名前は config.php の CACHEDIR で変更可能
デフォルトは cache

$ mkdir cache
$ chgrp video cache
$ chmod 775 cache


また、varやcacheの中身を web ブラウザから見られたく無い場合は
httpd.conf で AllowOverride Limit を指定してから
各ディレクトリの中に以下の内容で .htaccess を作成する

order deny,allow
deny from all



(4) wgetをインストールし、録画スクリプトを実行可能にする

録画スクリプト( do-record.sh ) の中でwgetを使用するのでインストールしておく。
またスクリプトを実行可能にする

$ chmod 755 do-record.sh


(5) web ブラウザで recfriio.php にアクセスして正常に動くか確認する

「ファイル(hogehoge)のオープンに失敗しました。」と表示される時は
var ディレクトリのパーミッションを調べて www-data ( apache ) からディレクトリに
ファイルを書き込めるか確認する

視聴、録画ボタンを押しても動作状況の表示が変わらないときは

$ ps aux | grep recfriio

で recfriio が動作しているか確認する。

もし動作をしているのに表示が変わっていない場合は

$ sudo kill -INT (PID)

でrecfriioを止めてから以下の項目を確認する

・ var ディレクトリのパーミッションを調べて www-data( apache ) がファイルを書き込めるか
・ wgetがインストールされているか

一方、recfriio が動作していない時は www-data( apache ) ユーザが recfriio を
起動できるか確認する。特に /var/lock/friiodetect のパーミッションが
間違っていないか確認すること

[4] 動作説明
録画ボタンを押すと do-record.sh というスクリプトファイルを起動する。
予約録画の場合は crontab が do-record.sh を起動する。

do-record.sh の中で recfriio を起動して PID を取得し、wget経由で do-record.php を 呼び出して recfriio server に PID を知らせる。

recfriio server は表示を更新する時に var ディレクトリの中を見て、ステータスファイル(status.csv)が あれば内容を表示する。停止ボタンを押すと対応する PID をkill -INTする。

以上の様に動作原理は単純なので、do-record.shを少し変更するだけで PT1 などにも応用できるはず。
[6] FAQ
Q. 今まで動いていたのに急に動かなくなった

A.
lsusb でチューナが認識されているか確認する。また、端末から手動で recfriio を動かすと ロックファイル( /var/lock/recfriio ) が出来るので www-data( apache ) がロックファイルを開けなくなる。その場合はロックファイルのパーミッションを変えるか消す。


Q. 予約録画のログは何処?

A.
var/log.txt


Q. 予約録画が始まると他の録画スレッドが止まる

A.
チューナ数が足りないと予約録画開始1分前に重要度の低い録画スレッドから停止するようにしてある。 チューナ数が十分にあるのに停止する場合は config.php の TUNERNUM の数字を正しく設定すること。


Q HDUSを挿す度にいちいち as11loader を実行するのが面倒くさい

A.
HDUSのファームウェア( SKNET_AS11Loader.sys ) を接続時に自動読み込みするように設定するには、 まずローダ(as11loader)のソース(as11loader.c)を次の様に書き換えてコンパイルする
@@ -49,7 +49,7 @@
 	int16_t idx;
 	int sys;
 
-	if ((sys = open("SKNET_AS11Loader.sys", O_RDONLY)) == -1){
+	if ((sys = open( argv[ 1 ], O_RDONLY)) == -1){
             fprintf( stderr, "could not open SKNET_AS11Loader.sys\n");
             goto ERROR;
         }
出来たas11loaderを適当なディレクトリに移して、/etc/udev/rules.d/80-programs.rules に次の文を追加 (パス)の部分は自分の環境に合わせて変える
# load the firmware of HDUS
SUBSYSTEM=="usb", ACTION=="add", \
	ATTRS{idVendor}=="1738", ATTRS{idProduct}=="5211", \
	RUN+="(パス)/as11loader (パス)/SKNET_AS11Loader.sys"
HDUSを差して
$ lsusb
Bus 003 Device 006: ID 3275:6051  
の様にIDが表示されればOK
更新履歴
・2009/2/9 ver.0.5.1

1回予約録画が録画後に予約一覧から削除されないバグを修正

・2009/2/8 ver.0.5

一回のみの予約録音で午前0時に丁度にセットした予約が開始しないバグを修正
予約設定画面で他の予約にエラーがあるとエラーが出続けるバグを修正
予約設定画面に「毎日」ボタンを付けた
予約時間の重複チェックをするようにした
空き容量に残り時間も表示するようにした( 126 Mbyte/分で計算 )

・2009/2/1 ver.0.4

TV王国から番組表をダウンロードしてiEPGによる予約が出来るようにした
タイトルにバージョンを入れるようにした
ディスク空き容量の表示を1分毎に更新するようにした

・2009/1/25 ver.0.3

一回のみの録画予約対応
予約画面に次回予定日を表示
予約と状況画面の更新にXMLHttpRequestを使うようにした
予約録画時にチューナ数が足り無い場合は重要度の低い録画から止めるようにした

・2009/1/17 ver.0.2

crontabによる録画予約機能追加
config-recfriio.phpを廃止してconfig.php一つに統一
設定ファイルや状態管理ファイル等は全て var 以下に作ることにした
操作画面の視聴、録画ボタンを押したときに全ての設定状態を保存するようにした
操作画面に設定保存ボタン追加
上書き防止の日付はdo-record.shの中で付けることにした
do-record.sh から do-record.php をwgetで呼び出して状態管理をするようにした
録画予約時のログ機能追加
動作状況の経過時間を「分:秒」表示にした
動作状況の表示更新リンクをボタンに変更
操作設定や状況をバーをクリックして折りたためるようにした
ヘルプへのリンクを追加
ヘルプをいろいろ更新

・2009/1/10 ver.0.1

公開