recfriio server
バージョン 0.7.1
ライセンス 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/〜 ) の
パーミッションを変更すること。
まず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
(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)に名前を合わせる( 半角と全角の違いは無視する )。
予約録画後のサスペンド機能を有効にしたい場合は ENABLESUSPEND を 1 にして
SUSPEND、および SUSPENDOPT を環境に合わせて変更する。詳しくは設定ファイルのコメントに書いてある。
すると予約画面に「録画後にサスペンド」というチェックボックスが現れる。
SUSPENDSEC にはサスペンドまでの待ち時間を入れる。録画が終了すると動作状況画面に
サスペンドまでの残り秒数が表示され、中止ボタンを押すとサスペンドを中止する。
(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 ) やサスペンドスクリプト( do-suspend.sh )の中で
wgetを使用するのでインストールしておく。またスクリプトを実行可能にする。
$ chmod 755 do-record.sh
$ chmod 755 do-suspend.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のパーミッション設定」の所は飛ばして
/etc/fstab に
none /proc/bus/usb usbfs auto,devmode=0666,devgid=(videoグループのgid) 0 0
という行を入れて再起動するとパーミッションが自動設定されるようになる。
また、/var/lock に www-data がロックファイルを書き込めるようにするため
# chown root:www-data /var/lock
# chmod 775 /var/lock
を実行する。
更に、HDUSを挿したまま起動したときに自動的にファームウェアを読み込ませるために
/etc/rc.local に次の文を追加する。
sleep 5
cd (パス)
./as11loader
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
sleep の秒数は適当に変える。
(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 );
また、サスペンドすることが出来ないので代わりにシャットダウンするしかない。
その場合はSUSPEND、および SUSPENDOPT は次の様にする。
define( 'SUSPEND', 'sudo /sbin/halt' );
define( 'SUSPENDOPT', '-p' );
sudo visudo には下の設定を追加しておく
%video ALL=(ALL) NOPASSWD: /sbin/halt
[6] FAQ
Q. 今まで動いていたのに急に動かなくなった
A.
lsusb でチューナが認識されているか確認する。また、端末から手動で recfriio を動かすと
ロックファイル( /var/lock/friiodetect ) が出来るのでwww-data( apache ) がロックファイルを開けなくなる。
その場合はロックファイルのパーミッションを変える。
または do-record.sh を書き換えて --lockfile オプションに違うロックファイルを指定する。
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を再起動した時は上の方法では自動でファームウェアは読み込まれ
ないようなので、その場合は rc.local で次の様に直接 as11loarder を呼び出す。
sleep 5
cd (パス)
./as11loader
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
sleep の秒数は適当に変える。
Q 管理メニューのパスワードが分からない
A.
設定ファイルの ADMINPASSWD で設定する。デフォルトはadmin
更新履歴
・2009/7/9 ver.0.7.1
TV王国の新形式番組表に対応
・2009/5/17 ver.0.7.0
予約画面に現在時刻を表示
重複チェックにバグがあったので修正
管理メニュー追加
複数の番組表表示に対応
・2009/2/16 ver.0.6.0
番組表キャッシュの保持日時を2週間に延長した( CATCHETIME -> CACHEDAY に変更 )
一回予約録画が終わってもcrontabからスケジュールが消えてなかったバグを修正
予約録画にサスペンド機能を追加
・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
公開