TV record with iEPG on Linux box

新規作成 Ver.0.1 shibata@luky.org 2003-11-10 01:14:27

概要

インターネットTVガイドテレビ王国で利用可能な iEPGを利用したテレビ予約の仕組みです。
出来るだけ簡単な実装を心がけています。

基本的な構成

Server boxの構成

Client boxの構成

基本的な動作の流れ

今回の実装

Client side

クライアント側は、WebブラウザでiEPG情報をダウンロードする。
例えば、インターネットTVガイドでは 番組表の[iEPG]のマークをクリックすることで、
下記のようなデータがダウンロード出来る。

 Content-type: application/x-tv-program-info; charset=shift_jis
 version: 1
 station: TVQ
 year: 2003
 month: 11
 date: 09
 start: 05:00
 end: 06:00
 program-title: 演歌◇健康

上記のデータにより、(一部の情報を補ってあげれば)録画予約設定に
必要な情報が得られることが分かる。
あとは、この情報を自動的にサーバ側に登録する仕組みを作れば良い。

よって、クライアントサイドで、上記のmime情報を自動的に
処理するスクリプトをブラウザ側に登録する。
下記のスクリプトは/usr/local/bin/iepg.shとして置いておく。

 #!/bin/sh
 #    iepg.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 nkf -e $1 |mail -s iEPG icommand@server.uriuri.com

いかにも「そのまんま」なスクリプトである(^^;

Subject:やメールの送信先は、適宜変更する必要がある。

次に、 Content-type: application/x-tv-program-infoのデータをダウンロードするときに
このスクリプトが自動的に起動するようにする必要がある。
galeonの場合は、~/.galeon/mimeTypes.xmlに

 <mimeitem name="application/x-tv-program-info" action="2" helper="/usr/local/bin/iepg.sh" helperNeedsTerminal="0" helperTakesUrl="0" alwaysUse="1"/>

などと記述すれば良い。

mailの送信先を自分のアドレスにしてみて、テストをすると良いでしょう。
尚、上記を見て気づかれたと思うが、iEPGのフォーマットさえ守れば、
人間がメールを送っても同じ事が出来る。
同じチャネルで連続して録画したいときなどは、独自にメールを作成して
送ればいいでしょう。

Server side

サーバ側は、クライアント側から送信されたメールを処理して、
しかるべき時刻に録画コマンドを起動する処理をおこなう必要がある。

/etc/aliasesに下記のような記述を追加し、root権限でnewaliasコマンドを実行する。

 icommand: "|/usr/local/bin/icommand.sh"

つまり、icommand@server.uriuri.com宛のメールが届くと、
そのメールの内容をicommand.shの標準入力に流し込んで起動すると言う設定である。

/usr/local/bin/icommand.shの内容を下記に示す。

 #!/bin/sh
 #    icommand.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 
 nkf -e $1 |sed 's/:/ /g'|awk '
 /station  KBC/		{channel=1;bc="KBC";}
 /station  NHK総合/	{channel=3;bc="NHK";}
 /station  RKB/		{channel=4;bc="RKB";}
 /station  NHK教育/	{channel=6;bc="NHKedu";}
 /station  TNC/		{channel=9;bc="TNC";}
 /station  TVQ/		{channel=19;bc="TVQ";}
 /station  FBS/		{channel=37;bc="FBS";}
 /year /			{year=$2;}
 /month /		{month=$2;}
 /date /			{date=$2;}
 /start /		{startH=$2;startM=$3;}
 /end /			{endH=$2;endM=$3;}
 
 END	{if (endH >= startH) {
 	   len = (endH * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }else {
 	   len = ((24 + endH) * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }
 	printf("echo /usr/local/bin/va1000cap.sh %d %d \
 	/var/tmp/%s-%4d-%02d-%02d_%02d%02d\ > \
 	/tmp/%4d-%02d-%02d_%02d%02d.shn\
 	at -f /tmp/%4d-%02d-%02d_%02d%02d.sh\
        %02d%02d %4d-%02d-%02d\n,\
 	channel,len,\
 	bc,year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	startH,startM,year,month,date);
       }
 '|sh

上記のスクリプトは、

この例は、福岡市の場合であり、テレビ局名とチェンネル番号は、
各地域毎に作り直す必要がある。

それにしても、こてこての泥臭さである(^^;

さて、上記スクリプトでさらに起動されているva1000cap.shの内容を下記に示す。

 #! /bin/sh
 # va1000cap.shby Hisaaki Shibata <shibata@luky.org>.
 
 NAME=va1000cap.sh
 DATE=`date +%Y%m%d%H%M`
 /usr/sbin/alsactl -f /home/shibata/asound.state restore
 
 /usr/bin/v4lctl setchannel $1
 
 /usr/bin/ffmpeg -f avi -vcodec msmpeg4v2 -hq -acodec mp3 -y -b 1200 -ab 128 -r 30 -s 384x288 -cropbottom 6 -cropleft 4 -cropright 4 -ar 22050 -ac 2 -t $2 $3-c$1-$DATE.avi
 
 exit 0

出力AVIファイル名の指定などに冗長なところがあるが、指定した時刻と、
実際に動作した時刻を比較するためのものであり、必要に応じていじっていただきたい。

また、この程度のスクリプトであれば、別途作成せず、
直接icommand.shで記載しても良いと思う。

SA7134のボードでのキャプチャの設定やffmpegに関しては、おいおい追記する。
Last modified: Mon Nov 10 02:55:12 JST 2003