Friioとlinuxとrecfriioとb25PC
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
