recfriio server
バージョン 0.5.2

ライセンス GPL3 (c) 2009 recfriio server project
開発環境 ubuntu8.04 + apache2.28 + php5.2.4 / 玄箱pro + debian4.0 + apache2.2.3-4+etch6 + php5.2.0-8+etch13 / 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との混在環境ではうまく動作しないかもしれません。

また、このヘルプはubuntu/debianで動かすことを念頭に書いてあるので、RH系の場合は 若干設定方法が違うので注意して下さい。 特に www-data というユーザ名は RH系のサーバの場合は apache に読み替えて下さい。
目次
[1] 使い方
[2] recfriio の設定
[3] recfriio server の設定
[4] 動作説明
[5] 玄箱Proでの運用
[6] FAQ

更新履歴
[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( RH系の場合は 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 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 となっていれば良い

udev は 2.6.15 以上のカーネルでないと動かないので注意
それよりも古いカーネルの場合は手動で /dev/bus/usb/〜( 又は /proc/bus/usb/〜 ) の
パーミッションを変更すること。


(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 などにも応用できるはず。
[5] 玄箱Proでの運用
想定する玄箱Pro の環境は以下の通りとする。

$ uname -a
Linux kurobox 2.6.12.6-mda1 #2 Sun Apr 22 16:16:39 JST 2007 armv5tejl GNU/Linux

$ cat /etc/debian_version 
4.0

(1) Debian をインストールする


(2) apache2 と php5 をインストール

# apt-get install apache2
# apt-get install php5

一般ユーザのディレクトリも見れるようにする。

# cd /etc/apache2/mods-enabled/
# ln -s ..//mods-available/userdir.load .
# ln -s ..//mods-available/userdir.conf .

また、php5のfgetcsv()関数で日本語が消えるのでシステムの locale を設定する。

# apt-get install locales
# dpkg-reconfigure locales

ja_JP.UTF-8 UTF-8 の作成とデフォルト指定をしたらリブート。


(3) recfriio と  as11loader のビルド

以下のパッケージをインストールする。

patch
make
g++
pkg-config
libglib2.0-dev
libboost-dev
libboost-thread-dev
libboost-filesystem-dev 
libpcsclite-dev
libusb-dev

更に

# cd /usr/lib
# ln -s libboost_thread-gcc-mt-1_33_1.so.1.33.1 libboost_thread-mt.so

ただし、このまま recfriio をビルドすると負荷が高すぎてドロップするので
コンパイルオプションを設定して最適化する。

まず recfriior4/Makefile の CXXFLAGS の行を

CXXFLAGS = -O3 -march=armv5te -pipe -fomit-frame-pointer -fprefetch-loop-arrays -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(B25) $(HDUS) $(UDP) `pkg-config --cflags glib-2.0`

に変更。次に arib25v021/arib25/src/Makefile の CFLAGS の行を

CFLAGS = -Wall -O3 -march=armv5te -pipe -fomit-frame-pointer -fprefetch-loop-arrays -g $(PCSC_CFLAGS) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

に変更して make する。


(4) kjournald を止める

kjournald の負荷が高くて(8%位)ドロップするので /etc/fstab をいじって ext3 -> ext2 にする。

/dev/sda4       /home           ext2    defaults        1       1


(5) その他のrecfiioの設定

基本的には[2] recfriio の設定の通りで良いが、
カーネルの問題でudevが起動しないので「(3) USBのパーミッション設定」の所は飛ばして
次の様にして手動でデバイスのパーミッションを設定する。

まずHDUSを挿して認識したか確認する。

# apt-get install usbutils
# lsusb
Bus 001 Device 008: ID 1738:5211  

例えば as11loader 実行後に次の様に IDが変わったとしたら、

# lsusb
Bus 001 Device 009: ID 3275:6051 

chown と chmod でデバイスのパーミッションを直接指定する。

#  chown www-data:video /proc/bus/usb/001/009
# chmod 664 /proc/bus/usb/001/009
# ls -al /proc/bus/usb/001/009
-rw-rw-r-- 1 www-data video 66 2009-02-14 20:32 /proc/bus/usb/001/009


(6) カードリーダの設定

はじめに pscsd と libccid をインストールする。ただし、このまま recfriio を動かしても

b25->set_b_cas_card failed. code=-8
disable b25 decoding.

というエラーが出て/var/log/messages に

Feb 13 21:29:31 localhost pcscd: winscard_svc.c:565:MSGCheckHandleAssociation() Client failed to authenticate

と表示される。調べたら

ttp://pc11.2ch.net/test/read.cgi/linux/1193058543/699
> [ Linux ] Linux でビデオ録画【六枚目】
> 699 名前:login:Penguin []: 2008/11/01(土) 22:59:30 ID:UEZF30rt (2) 
> 記事の中にもあるように-fno-strict-aliasingをつけて解決。

という話があったので pcsc-lite-1.4.102.tar.bz2 をダウンロードして自分で作成して
pscsd と libccid を上書きすることにする。きちんとパッケージを作りたい人は上の2chのスレを参考にすること。

まず次のパッケージをインストール

libhal-dev

次に configure の 22680 行辺りの

CFLAGS="-Wall -fno-common $CFLAGS"

を 

CFLAGS="-Wall -fno-strict-aliasing $CFLAGS"

に変更してから 

./configure --disable-libhal --sysconfdir=/etc --prefix=/usr --enable-usbdropdir=/usr/lib/pcsc/drivers LDFLAGS="-lpthread"
make 
make install

(注意) 今回の環境では --disable-libhal を付けないとデーモンが起動しなかった。

次に ccid-1.3.9.tar.bz2 をダウンロードしてきて

./configure --sysconfdir=/etc --prefix=/usr --enable-usbdropdir=/usr/lib/pcsc/drivers
make 
make install


(7) recfriio を動かす

www-dataにsuしてテストしてみる。CPU負荷は平均で 55% 程度となる。

ただし、kill -INT で止めると

recfriio: select failed.: Interrupted system call

と出る時がある(要調査)。


(8) recfriio server の設定

基本的には[3] recfriio server の設定の通りで良いが、
crontabが一般ユーザから実行出来ないので

# chmod +s /usr/bin/crontab

しておく。

また、apacheにアクセスすると一時的に負荷が上がってドロップが生じるので
下の様にconfig.phpの REFRESH の値を大きく取って手動で表示を更新した方が良い。

// 動作状況の更新間隔(秒)
define( 'REFRESH', 10000 );
[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 ) を接続時に自動読み込みするようにするには、 /etc/udev/rules.d/80-programs.rules に次の文を追加する。
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
# load the firmware of HDUS
SUBSYSTEM=="usb", ACTION=="add", \
	ATTRS{idVendor}=="1738", ATTRS{idProduct}=="5211", \
	RUN+="/bin/sh -c 'cd (パス);./as11loader'"
HDUSを差して
$ lsusb
Bus 003 Device 006: ID 3275:6051  
の様にIDが表示されればOK。ただし、PCを再起動した時は上の方法では自動でファームウェアは読み込まれないようなので注意。
更新履歴
・2009/2/14 ver.0.5.2

・ヘルプに玄箱proの項を追加

・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

公開