« 山口4日目 | メイン | W61S »

2008年04月28日(月)

Friioとlinuxとrecfriioとb25

LinuxでのFriioの録画予約について、必要十分な環境を整えたのでまとめる。
※「動けばいい」のでかなり楽をしているし、この方法ではこれ以上の拡張は泥縄かと…。

まず、Friio関連で
・Linux用Friio録画コマンド
http://2sen.dip.jp:81/cgi-bin/friioup/source/up0281.zip
・Linux用 b25 v0.2.1 tsselect v0.1.4
http://2sen.dip.jp:81/cgi-bin/friioup/source/up0404.zip
を使用している。
作成者各位に感謝いたします。

録画機の環境は
IBM ThinkCentre S50 8183-39J
http://www-06.ibm.com/jp/domino04/pc/support/Sylphd12.nsf/jtechinfo/SYP0-031A394
にRAM 512MB*2
PATA 160GB(システム用)
PATA 500GB(保存用)
SATA 250GB(作業用)
で秋月のUSB-YケーブルでFriioを2台接続。

テレビ王国のiEPGのURIをTeraTermProのマクロを使ってSSHで録画機に渡し、録画開始の1分前でcrontabに登録。
59秒(1秒前)から録画を開始する。

WindowsPC
Opera
↓epg_book.bat
UTF-8 TeraTermPro(epg_book.ttl)

friioSRV(CentOS 5.1)
epg_book.pl
↓crontabに1分前で登録
...
cron_rec.pl
↓59秒から録画開始
↓b25で暗号解除
DLNA公開ディレクトリにMPEG2-TSファイル作成

PS3(DLNAクライアント)
friioSRVがmediatombでMPEG2-TSを公開しているので、再生できる

●1.録画機のOS及び各種ソフトのインストール

boot from CentOS-5.1-i386-netinstall.iso

Choose a Language
Japanese
Keyboard Type
us
Installation Method
HTTP
Configure TCP/IP
Enable IPv4 support
DHCP
HTTP Setup
ftp.riken.jp
/Linux/centos/5.1/os/i386/

CentOS 5

インストール CentOS

ハードディスク
カスタムレイアウトを作成します
ドライブ
/dev/hda1 / 151597
/dev/hda2 swap 1027
ブートローダ

ネットワーク

時刻

rootパスワード

パッケージ
Desktop - Gnome
Packages from CentOS Extras
今すぐカスタマイズする
カスタマイズ
デスクトップ環境
GNOME デスクトップ環境
アプリケーション
エディタ
グラフィカルインターネット
firefox
開発
レガシーなソフトウェアの開発
開発ツール
開発ライブラリ
サーバ
FTPサーバ
Windowsファイルサーバ
ベースシステム
ベース
CentOS Extras
Yum Utilities
インストール

再起動

Setup Agent
Firewall configuration
Disabled
SELinux:Disabled
System services
acpid
anacron
apmd
atd
auditd
autofs
avahi-daemon
cpuspeed
crond
cups
firstboot
gpm
haldaemon
hidd
ipqbalance
kudzu
lvm2-monitor
mcstrans
mdmonitor
messagebus
microcode_ctl
pcscd
readhead_early
restorecond
rpcidmaps
smartd
smb
sshd
syslog

●ユーザの追加
crontabを使うので録画予約専用のユーザを作成
※ここでは"friio"とする

●sudo
vi /etc/sudoers
%wheel ALL=(ALL) ALL

vi /etc/group
wheel:x:10:root,tak

●文字コード
vi /etc/sysconfig/i18n
LANG="ja_JP.EUC-JP"

vi /etc/man.config
#PAGER /usr/bin/less -is
PAGER /usr/more

●sshd
vi /etc/ssh/sshd_conf
Port 22
SyslogFacility AUTHPRIV
PermitRootLogin no
X11Forwarding yes
Subsystem sftp /usr/libexec/openssh/sftp-server

/etc/init.d/sshd restart

●ntpd
yum install ntp.i386
mv /etc/ntp.conf /etc/ntp.conf.default
vi /etc/ntp.conf
server ntp.nict.jp

/etc/init.d/ntpd start
chkconfig ntpd on

●vsftpd
/etc/init.d/vsftpd start
chkconfig vsftpd on

●friio
wget http://2sen.dip.jp:81/cgi-bin/friioup/source/up0368.zip
unzip up0368.zip
cd marumolinuxr2/arib25v020/arib25/
make
sudo cp src/b25 /usr/local/bin/
sudo mv /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist.default
vi libccid_Info.plist
<string>libccid.so.1.3.1</string>

<string>libccid.so.1.0.1</string>
sudo cp ./libccid_Info.plist /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
sudo /etc/init.d/pcscd restart

cd ../../tsselectv014r2/tsselect
make
sudo cp src/tsselect /usr/local/bin/

wget http://2sen.dip.jp:81/cgi-bin/friioup/source/up0281.zip
unzip up0281.zip
cd extrec/recfriio/

vi recfriio.cpp
#include <linux/usb/ch9.h>

#include <linux/usb_ch9.h>

562行目をコメントアウト
// std::cout << "Search friios from dir: " << base_dir << std::endl;

make
sudo cp recfriio /usr/local/bin/
sudo chmod u+s /usr/local/bin/recfriio

●yum
vi /etc/yum.repos.d/CentOS-Base.repo
[centosplus]
enabled=1

[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1

rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

yum -y update

●MediaTomb
wget http://jaist.dl.sourceforge.net/sourceforge/mediatomb/mediatomb-0.10.0-1.src.rpm
sudo rpmbuild --rebuild mediatomb-0.10.0-1.src.rpm
sudo rpm -ivh /usr/src/redhat/RPMS/i386/mediatomb-0.10.0-1.i386.rpm

sudo vi /etc/mediatomb.conf
MT_INTERFACE="eth0"

sudo mkdir /etc/mediatomb
sudo vi /etc/mediatomb/config.xml
<?xml version="1.0" encoding="EUC-JP"?>
<config xmlns="http://mediatomb.cc/0.10.0/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mediatomb.cc/0.10.0/config http://mediatomb.cc/0.10.0/config.xsd">
<server>
<ui enabled="yes">
<accounts enabled="no" session-timeout="30"/>
</ui>
<name>DeveloPlus</name>
<udn>uuid:f1b03bcf-c378-4b3a-8215-f320831b96ba</udn>
<home>/etc/mediatomb</home>
<webroot>/etc/mediatomb/web</webroot>
<storage driver="sqlite3">
<database-file>mediatomb.db</database-file>
</storage>
<protocolInfo extend="yes"/>
</server>
<import hidden-files="no">
<filesystem-charset>EUC-JP</filesystem-charset>
<metadata-charset>CP932</metadata-charset>
<scripting script-charset="EUC-JP">
<virtual-layout type="builtin"/>
</scripting>
<mappings>
<extension-mimetype ignore-unknown="no">
<map from="jpg" to="image/jpeg"/>
<map from="jpeg" to="image/jpeg"/>
<map from="gif" to="image/gif"/>
<map from="png" to="image/png"/>
<map from="m4v" to="video/mp4"/>
<map from="mp4" to="video/mp4"/>
<map from="m2ts" to="video/mpeg"/>
<map from="mpg" to="video/mpeg"/>
<map from="mpeg" to="video/mpeg"/>
<map from="divx" to="video/divx"/>
<map from="avi" to="video/avi"/>
<map from="mp3" to="audio/mpeg"/>
<map from="ogg" to="application/ogg"/>
<map from="asf" to="video/x-ms-asf"/>
<map from="asx" to="video/x-ms-asf"/>
<map from="wma" to="audio/x-ms-wma"/>
<map from="wax" to="audio/x-ms-wax"/>
<map from="wmv" to="video/x-ms-wmv"/>
<map from="wvx" to="video/x-ms-wvx"/>
<map from="wm" to="video/x-ms-wm"/>
<map from="wmx" to="video/x-ms-wmx"/>
<map from="m3u" to="audio/x-mpegurl"/>
<map from="pls" to="audio/x-scpls"/>
</extension-mimetype>
<mimetype-upnpclass>
<map from="audio/*" to="object.item.audioItem.musicTrack"/>
<map from="application/ogg" to="object.item.audioItem.musicTrack"/>
<map from="video/*" to="object.item.videoItem"/>
<map from="image/*" to="object.item.imageItem"/>
</mimetype-upnpclass>
<mimetype-contenttype>
<treat mimetype="audio/mpeg" as="mp3"/>
<treat mimetype="application/ogg" as="ogg"/>
<treat mimetype="audio/x-flac" as="flac"/>
<treat mimetype="image/jpeg" as="jpg"/>
<treat mimetype="audio/x-mpegurl" as="playlist"/>
<treat mimetype="audio/x-scpls" as="playlist"/>
</mimetype-contenttype>
</mappings>
</import>
</config>

sudo chown nobody.nobody /etc/mediatomb/config.xml
sudo cp -r /usr/share/mediatomb/web /export/mediatomb/
sudo /etc/init.d/mediatomb start
sudo /sbin/chkconfig mediatomb on

●2.録画関係のスクリプト

●epg_book.pl
iEPGファイルのURIからcrontabに録画予約登録(1分前で登録)
登録されている予約に同じ予約を重ねると削除
予約時点で過去の日時の他の予約を削除

#!/usr/bin/perl

$rec_cmd = "/usr/local/bin/cron_rec.pl";
$dir = "/work";
$book_file = "$dir/epg_book.cron";

use Encode;
use Time::Local;

$url = $ARGV[0];
if (!$ARGV[0]) {print 'usage: epg_book.pl {url}'; exit;}
if ($ARGV[0] eq 'check') {print `crontab -l`; exit;}

`wget -q -4 -O $dir/_epg_book.tvpi \"$url\"`;
`nkf -e $dir/_epg_book.tvpi > $dir/_epg_book.tvpi.euc`;

open (IN, "$dir/_epg_book.tvpi.euc");
@lines = <IN>;
close (IN);

foreach $line(@lines){
$line =~ s/\r\n//;
if ($line =~ /multi-program-title: /) {print "nNOT Supported Multi-Program-Title\n"; exit;}
if ($line =~ /station: /){
($tmp, $ch) = split (/: /, $line);
if ($ch eq '') {print "ERROR NULLch\n$line\n"; exit;}
elsif ($ch =~ /NHK総合/ || $ch =~ /DFS00400/) {$rec_ch = '27';}
elsif ($ch =~ /NHK教育1/ || $ch =~ /DFS00408/) {$rec_ch = '26';}
elsif ($ch =~ /テレビ埼玉/ || $ch =~ /DFS07438/) {$rec_ch = '32';}
elsif ($ch =~ /日本テレビ/ || $ch =~ /DFS00410/) {$rec_ch = '25';}
elsif ($ch =~ /テレビ朝日/ || $ch =~ /DFS00428/) {$rec_ch = '24';}
elsif ($ch =~ /TBSテレビ/ || $ch =~ /DFS00418/) {$rec_ch = '22';}
elsif ($ch =~ /テレビ東京/ || $ch =~ /DFS00430/) {$rec_ch = '23';}
elsif ($ch =~ /フジテレビ/ || $ch =~ /DFS00420/) {$rec_ch = '21';}
elsif ($ch =~ /MXテレビ/ || $ch =~ /DFS05C38/) {$rec_ch = '20';}
elsif ($ch =~ /放送大学/ || $ch =~ /DFS00440/) {$rec_ch = '28';}
else {print "ERROR\n$ch\n"; exit;}
} # if
elsif ($line =~ /year: /){($tmp, $year) = split (/: /, $line);}
elsif ($line =~ /month: /){($tmp, $month) = split (/: /, $line);}
elsif ($line =~ /date: /){($tmp, $date) = split (/: /, $line);}
elsif ($line =~ /start: /){
($tmp, $start) = split (/: /, $line);
($SHH, $SMM) = split (/:/, $start);
} # elsif
elsif ($line =~ /end: /) {
($tmp, $end) = split (/: /, $line);
($EHH, $EMM) = split (/:/, $end);
} # elsif
elsif ($line =~ /program-title: /){($tmp, $title) = split (/: /, $line);}
elsif ($line =~ /program-subtitle: /){($tmp, $subtitle) = split (/: /, $line);}
} # foreach

$title = "$year-$month-$date $SHH:$SMM $title";
if ($subtitle ne '') {$ttl = "$title ~ $subtitle";}
else {$ttl = $title;}

$title = decode('iso-2022-jp', $title);
$title =~ s/&#([0-9]+);/chr($1)/ge;
$title =~ s/&#[xX]([0-9A-Fa-f]+);/chr(hex $1)/ge;
$title = encode('euc-jp', $title);

if ($EHH >= $SHH){$rec_sec = ($EHH - $SHH)*3600 + ($EMM - $SMM)*60;}
elsif ($EHH < $SHH) {$rec_sec = ($EHH + 24 - $SHH)*3600 + ($EMM - $SMM);}
else {print "ERROR\n$SHH\n$EHH\n"; exit;}

`crontab -l > $book_file`;

print "\n$month月$date日 $SHH:$SMM~$EHH:$EMM $ch $title\n";

$tm = timelocal(0, $SMM, $SHH, $date, $month, $year);
($SMM, $SHH, $date, $month, $year) = (localtime($tm - 60))[1...5];
$year = $year + 1900;
$program = "$SMM $SHH $date $month \* $rec_cmd $rec_ch $rec_sec \"$title\"";

open FH, "$book_file";
@lines = <FH>;
close FH;

foreach $line(@lines) {
chomp $line;
if ($line eq $program) {$del = 1; next;}
else {push @book, $line;}
} # foreach

print "\n### 削 除 ###\n";
if ($del == 1){print "$program\n";}
else {push @book, $program;}

$YYYY = `date "+%Y"`;
$now = `date "+%M %H %d %m"`;
chomp $now;
push @book, $now;

@book = sort { (split(/ /,$a))[0] <=> (split(/ /,$b))[0] } @book;
@book = sort { (split(/ /,$a))[1] <=> (split(/ /,$b))[1] } @book;
@book = sort { (split(/ /,$a))[2] <=> (split(/ /,$b))[2] } @book;
@book = sort { (split(/ /,$a))[3] <=> (split(/ /,$b))[3] } @book;

$ret = '';
print "\n### 旧予約 ###\n";
until ($ret eq $now) {
$ret = shift @book;
if ($year != $YYYY){push @book, $ret;}
elsif ($ret != $now){print "$ret\n";}
} # until

print "\n### crontab ###\n";
open FH, ">$book_file";
foreach (@book){print FH "$_\n"; print "$_\n";}
close FH;

`crontab $book_file`;

`rm $dir/_epg_book*`;

exit;

●cron_rec.pl
予約時刻にcronによって起動
予約時刻の1秒前から録画動作開始

#!/usr/bin/perl

#-------------------------------------------------------------------#
# 変数宣言

$cmd_rec = '/usr/local/bin/recfriio';
$cmd_b25 = '/usr/local/bin/b25';
$cmd_tss = '/usr/local/bin/tsselect';

$tmpdir = '/work';
$outdir = '/DLNA/video';

$rec_ch = $ARGV[0];
$rec_sec = $ARGV[1];
$title = $ARGV[2];

#-------------------------------------------------------------------#
# TS録画 & ARIB STD-B25

`nice -19 mkfifo "$tmpdir/$title.fifo0" "$tmpdir/$title.fifo1"`;

until ($sec == 59){
$sec = (localtime)[0];
if ($sec < 58) {sleep 1;}
} # until

`$cmd_rec $rec_ch $rec_sec "$tmpdir/$title.fifo0" & $cmd_b25 "$tmpdir/$title.fifo0" "$tmpdir/$title.fifo1" & dd if="$tmpdir/$title.fifo1" of="$tmpdir/$title.ts" bs=1M`;

#-------------------------------------------------------------------#
# without 1segTS

$pid = `nice -19 $cmd_tss \"$tmpdir/$title.ts\"`;
if ($pid =~ /.* scrambling=[^0]/) {
`nice -19 mv "$tmpdir/$title.ts" "$tmpdir/$title_b25.ts"`;
`nice -19 mkfifo "$tmpdir/$title.fifo"`;
`nice -19 cat "$tmpdir/$title_b25.ts" > "$tmpdir/$title.fifo" & dd if="$tmpdir/$title.fifo" of="$tmpdir/$title.ts" ibs=188 obs=1M skip=1`;
`nice -19 rm "$title.fifo"`;
} # if
$pid =~ s/pid=//g;
$pid =~ s/, .*//g;
# ワンセグ除去
$pid =~ s/0x1fc8//g;
# NHK教育テレビ 3rdSD除去
if ($rec_ch eq 26) {$pid =~ s/0x04f0//g;}
$pid =~ s/\n+/ /g;
`nice -19 $cmd_tss \"$tmpdir/$title.ts\" \"$outdir/$title.m2ts\" $pid`;
`nice -19 chmod 666 \"$outdir/$title.m2ts\"`;

#-------------------------------------------------------------------#
# remove workfile

`nice -19 rm "$tmpdir/$title.fifo0" "$tmpdir/$title.fifo1" "$tmpdir/$title.ts"`;

exit;

●3.Windows機側の設定

●Operaの設定
Operaでtvpiとtvpidファイルをepg_book.batに関連づけ。
「ウェブアドレスを直接アプリケーションに渡す」にチェック。

●epg_book.bat
@echo off
"C:\Program Files\teraterm\ttpmacro.exe" "%~d0%~p0\epg_book.ttl" "%1=%2"
exit

●epg_book.ttl
show 0

strscan param2 'http://'
if result=0 then
data = 'check'
else
data = param2
endif

connect 'friio.hoge.fuga:22 /ssh /auth=password /user=friio /passwd=**********'

wait '$'
send "epg_book.pl '"
send data
sendln "'"

wait '$'
messagebox '終了します。' 'Tera Term'
sendln 'exit'
closett
end


Friio関連エントリ検索

トラックバック

この一覧は、次のエントリーを参照しています: Friioとlinuxとrecfriioとb25:

» Friioとlinuxとrecfriioとb25(その2) from www.okubo.tk/blog
つづき Opera 9.5になってURIの渡し方が変わっていた…のでメモ。 ダブ... [詳しくはこちら]

» 人気(?)エントリ!? (2008年版) from www.okubo.tk/blog
前回は2007年4月2日だったが、今年の4月は忙しかったのか忘れていた。 仕方が... [詳しくはこちら]

» PE from PukiWiki Plus! (PukiWiki/TrackBack 0.3)
1 : login:Penguin : 2008/06/14(土) 02:32:40 ID:Ru/elGDS Linuxでfriioを使う事に関して話し合... [詳しくはこちら]

» 人気(?)エントリ!? (2009年版) from www.okubo.tk/blog
前回は2008年07月25日(金)だったが、2009年4月1日に忘れずに調査しよ... [詳しくはこちら]

このエントリーのトラックバックURL:
http://www.okubo.tk/blog/mt-tb.cgi/6867

コメントを投稿

« 山口4日目 | メイン | W61S »

«  2008年04月  »

12345
6789101112
13141516171819
20212223242526
27282930

アーカイブ

2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
2002年
2001年
2000年
1978年
Total 3131 Entries.

カテゴリー

Powered by
Movable Type 3.2-ja-2

38.107.179.213

38.107.179.213