録るメーラー (recbymail) 2010/11/20 版を少し改良してみた。

PT2 + epgrec な地デジ録画鯖をメールで録画予約、録画予約キャンセルなどができたらいいなーと思い、ググってみたら、やっぱり先人がおられましたw 一から作る前にググってみるんやな。

kn_ishi さんが 地デジ録画サーバー(CentOS5.5+PT2+epgrec)をメールで録画予約できるようにする。 を作っておられました。ここは有り難く拝借しました。有難うございます。

録るメーラーに必要なパッケージ

epgrec が動いている時点で、すでに以下のような基本的な php5 関連パッケージは入っていると思います。Vine Linux 5(または、次期 Vine Linux 6)では、以下のパッケージが入っていれば、大丈夫です。

$ sudo apt-get install php5 php5-apache2 php5-devel php5-pear php5-mcrypt

メール関連の PHP スクリプトなので、それらを pear を使ってインストールしておきます。pear は、OS 問わず同じですね。

$ sudo pear install -a mail
$ sudo pear install mail_mime
$ sudo pear install net_pop3

録るメーラーの 2010/11/20 版からの変更点

録るメーラーの 2010/11/20 版の recbymail.php では、情報返信(HTMLファイル) のところで、一部の正規表現がおかしいところがあって、「Subject: TV!番組送って」としても、番組一覧ではなく、番組表が返ってきていましたので、簡単な修正を入れてみました。あと、BS 番組表も返してくれたら嬉しいので、そうしてみました。その他は、個人的な趣味でいくつか変更を入れました。

diff -up recbymail.php.orig recbymail.php
--- recbymail.php.orig	2011-04-24 19:15:07.000000000 +0900
+++ recbymail.php	2011-04-24 19:53:00.000000000 +0900
@@ -148,11 +148,11 @@ function proc_request($return,$request){
         }
 
         //情報返信(TEXT)
-        if(preg_match("/TV!(.+)教えて/", $request, $matches) == 1){
-                if(DEBUGSW=="on"){ print($matches[1]."\n"); };
+        if(preg_match("/TV!(\s)?(.+)教えて/", $request, $matches) == 1){
+                if(DEBUGSW=="on"){ print($matches[2]."\n"); };
                 $msg="";
                 $write=false;
-                if(mb_ereg("^番組*",$matches[1])){
+                if(mb_ereg("^番組",$matches[2])){
                         $files = fopen(EPGREC_URL."programTable.php", "r");
                         while( ($line = fgetss($files, 1024 )) !== false) {
                                 $line=trim($line);
@@ -171,7 +171,7 @@ function proc_request($return,$request){
                                 }
                         }
                 }
-                elseif(mb_ereg(".*予約*",$matches[1])){
+                elseif(mb_ereg("^予約",$matches[2])){
                         $files = fopen(EPGREC_URL."reservationTable.php", "r");
                         while( ($line = fgetss($files, 1024 )) !== false) {
                                 $line=trim($line);
@@ -190,7 +190,7 @@ function proc_request($return,$request){
                                 }
                         }
                 }
-                elseif(mb_ereg("^録画*",$matches[1])){
+                elseif(mb_ereg("^録画",$matches[2])){
                         $files = fopen(EPGREC_URL."recordedTable.php", "r");
                         while( ($line = fgetss($files, 1024 )) !== false) {
                                 $line=trim($line);
@@ -209,8 +209,8 @@ function proc_request($return,$request){
                                 }
                         }
                 }
-                elseif( (mb_ereg("^ログ*",$matches[1])) || (mb_ereg("^ろぐ*",$matches[1]))
-                     || (mb_ereg("^LOG*",$matches[1])) || (mb_ereg("^log*",$matches[1])) ) {
+                elseif( (mb_ereg("^[ろロ][ぐグ]",$matches[2])) || 
+                        (mb_ereg("^[llLL][ooOO][gGgG]",$matches[2])) ) {
                         $files = fopen(EPGREC_URL."logViewer.php", "r");
                         while( ($line = fgetss($files, 1024 )) !== false) {
                                 $line=trim($line);
@@ -240,37 +240,47 @@ function proc_request($return,$request){
         }
 
         //情報返信(HTMLファイル)
-        if(preg_match("/TV!(.+)送って/", $request, $matches) == 1){
-                if(DEBUGSW=="on"){ print($matches[1]."\n"); };
-                if(mb_ereg("^番組表*",$matches[1])){
-                        $file=dirname(__FILE__)."/bangumihyou.html";
-                        file_put_contents($file,file_get_contents(EPGREC_URL."index.php"));
-                        $msg="番組表だよ by 録るメーラー";
+        if(preg_match("/TV!(\s)?(.+)送って/", $request, $matches) == 1){
+                if(DEBUGSW=="on"){ print($matches[2]."\n"); };
+                if(mb_ereg("^([GG][RR]|地上)?番組表",$matches[2])){
+                        $file=dirname(__FILE__)."/gr-bangumihyou.html";
+                        file_put_contents($file,file_get_contents(EPGREC_URL."index.php?type=GR"));
+                        $msg="地上デジタル番組表だよ by 録るメーラー";
+                }
+                elseif(mb_ereg("^[BB][SS]番組表",$matches[2])){
+                        $file=dirname(__FILE__)."/bs-bangumihyou.html";
+                        file_put_contents($file,file_get_contents(EPGREC_URL."index.php?type=BS"));
+                        $msg="BSデジタル番組表だよ by 録るメーラー";
+                }
+                elseif(mb_ereg("^[CC][SS]番組表",$matches[2])){
+                        $file=dirname(__FILE__)."/cs-bangumihyou.html";
+                        file_put_contents($file,file_get_contents(EPGREC_URL."index.php?type=CS"));
+                        $msg="CSデジタル番組表だよ by 録るメーラー";
                 }
-                elseif(mb_ereg("^番組*",$matches[1])){
+                elseif(mb_ereg("^番組",$matches[2])){
                         $file=dirname(__FILE__)."/bangumi.html";
                         file_put_contents($file,file_get_contents(EPGREC_URL."programTable.php"));
-                        $msg="番組一覧だよ by 録るメーラー";
+                        $msg="番組一覧だよ by 録るメーラー";
                 }
-                elseif(mb_ereg(".*予約*",$matches[1])){
+                elseif(mb_ereg("^予約",$matches[2])){
                         $file=dirname(__FILE__)."/yoyaku.html";
                         file_put_contents($file,file_get_contents(EPGREC_URL."reservationTable.php"));
-                        $msg="録画予約一覧だよ by 録るメーラー";
+                        $msg="録画予約一覧だよ by 録るメーラー";
                 }
-                elseif(mb_ereg("^録画*",$matches[1])){
+                elseif(mb_ereg("^録画",$matches[2])){
                         $file=dirname(__FILE__)."/rokugazumi.html";
                         file_put_contents($file,file_get_contents(EPGREC_URL."recordedTable.php"));
-                        $msg="録画済一覧だよ by 録るメーラー";
+                        $msg="録画済一覧だよ by 録るメーラー";
                 }
-                elseif( (mb_ereg("^ログ*",$matches[1])) || (mb_ereg("^ろぐ*",$matches[1]))
-                     || (mb_ereg("^LOG*",$matches[1])) || (mb_ereg("^log*",$matches[1])) ) {
+                elseif( (mb_ereg("^[ろロ][ぐグ]",$matches[2])) || 
+                        (mb_ereg("^[llLL][ooOO][gGgG]",$matches[2])) ) {
                         $file=dirname(__FILE__)."/log.html";
                         file_put_contents($file,file_get_contents(EPGREC_URL."logViewer.php"));
-                        $msg="動作ログだよ by 録るメーラー";
+                        $msg="動作ログだよ by 録るメーラー";
                 }
                 else{
                         $file=null;
-                        $msg="それはできないなぁ by 録るメーラー";
+                        $msg="それはできないなぁ by 録るメーラー";
                 }
                 mailsend($return,"Re:".$request,$msg,$file);
                 if($file){ unlink($file); };

Diff finished.  Sun Apr 24 20:04:41 2011

上記変更に対する、ヘルプのファイルも以下のように豪華にしてみました(w

$ cat recbymail.help.txt
録るメーラー(recbymail)Subject: の書式

Subject: TV!<何か><アクション>
<アクション> は、
  教えて, 送って, 録って, 録らないで
の 4 つがある。
<何か> は、各 <アクション> ごとによる。

* 使い方、ヘルプ
TV!教えて

* 録画予約
TV!([<タイプ>]<チャンネル>)<時間>時<番組名>録って
<タイプ>, <チャンネル> は後述を参照。

* 録画解約
TV!([<タイプ>]<チャンネル>)<時間>時<番組名>録らないで
<タイプ>, <チャンネル> は後述を参照。

* TEXT情報要求
TV!<項目>教えて
指定した <項目> を TEXT 形式で返す。
  * 番組: 番組一覧のリスト
  * 予約: 録画予約一覧のリスト
  * 録画: 録画済一覧のリスト

* HTML情報要求
TV!<項目>送って
指定した <項目> を HTML 形式で返す。
  * 番組表: 地上波デジタル番組表
  * BS番組表: BSデジタル番組表
  * CS番組表: CSデジタル番組表
  * 番組: 番組一覧
  * 予約: 予約一覧
  * 録画: 録画済一覧

* <タイプ>
GR, BS, CS

* <チャンネル>
[GR]
  27: NHK
  26: 教育
  25: 日テレ
  22: 東京
  21: フジ
  24: テレ朝
  23: テレ東
//  20: MX TV
//  18: テレ神
  30: 千葉
//  32: テレ玉
  28: 大学

[BS]
  101: NHK BS1
  103: NHK BSプレミアム

録画ッター http://kissrobber.appspot.com/rokugatter/ も面白いのですが、twitter の仕様が変わるたびに、対応に追われるのが面倒(それを面白いとみる人もいるかもしれませんが (^^;;)なので、やるならばメールにしようと思っていました。

元々、GV/MVP-RX2 でも同様なメールでの録画システムを自作していたので、それが地デジでもまたできるとは、嬉しいですねー。

ではでは。