epgrecを改造してプログラムの仕方を覚える① 準備編


本稿はepgrecを改造したパッチを配るのではなく、プログラムを書いたことが無いけれど、興味はある方向けに、epgrecを改造してもらう事で『オープンソースのプログラムを改造して使っています』と言う成果を出してもらう事を目的としています。

開発自体はUbuntuLinux13.10上で行うため、あらかじめPT3が動く環境を構築してある事を前提条件とします。ただし、ハードウェアをそろえずにepgrecを改造してみたい方が最初から挫折する事を防ぐため、テスト用のXMLデータをアップロードしておきましたのでダウンロードしてお使いください。

epgrecの紹介

日経Linux誌2009年7月売り号(8月号)に掲載するために開発された録画予約システムで、PT1/PT2/PT3と一緒に利用して、地デジやBS/CSを録画予約する為のプログラムです。tar.gz形式でダウンロード可能な物は2011/10/02を最後に更新が止まってしまったようですが、http://sourceforge.jp/projects/epgrec/scm/git/epgrec/を見る限り、ソースコードの更新は2012/06/18まで続いていたようです。その後STZ版が登場していますが、本家の最新版との差分はそこまで無いことから、本家のバージョンを利用させてもらう事にします。

環境の準備

今まで当サイトで利用させてもらっていたのはSTZ版だった為、epgrec(本家)のインストール方法を簡単に記載しておきます。ubuntu13以上にインストールする場合にはphpのセキュリティの設定等でubuntu12以下と比べて四苦八苦するところが多くなっています。その辺諸々を含めてセットアップ方法を『ubuntu13.10+epgrec(本家)+pt3+nginx+php5-fpm 環境構築』にまとめてあります。

番組表更新や録画予約の仕組みを理解する

まずは、epgrecがどのような仕組で動いているのかを理解しましょう。大体のイメージは下記の図の通りです(下手な図ですが、文章ではなく、イメージで伝わればいいです)。epgrecにはFireFoxやIE、Chromeでアクセスして操作します。その下では番組表の更新はcronで定期実行し、番組の予約録画はatジョブで実行されるようになっています。

recpt1やepgdump等を解説ページを参考に言われるままにインストールしてきた場合には、recpt1で録画し、epgdumpでtsファイルからxmlを出力し、そのxmlを元に番組表を更新していると理解しておけば問題ありません。

epgrecのザックリ概要

ディレクトリ構成

まずは、epgrecの作者様のReadMeを参考に、大まかなディレクトリ構成を頭に入れます。開発中はファイル構成やシステム構成は何度も見直すことになる為、プリントアウトして手元に置いておくと効率的です。

ファイル 説明
├── DBRecord.class.php DBRecordクラス
├── Keyword.class.php キーワードレコードクラス(親:DBRecord)
├── LICENSE.txt ライセンス。もちろん目を通しておきましょう。
├── README.ja ReadMe。目を通しておきましょう。
├── Reservation.class.php 予約クラス。静的メソッドsimple()、静的メソッドcustom()。
├── Settings.class.php 設定の読み出し/保存を行うクラス(親:SimpleXML)
├── Smarty SmartyはPHPのフレームワーク。気にしないでOK
├── cache
├── cancelReservation.php JavaScriptから呼ばれる予約取り消し
├── changeReservation.php JavaScriptから呼ばれる予約内容の更新
├── config.php.sample config.phpのサンプルファイル
├── cron.d
│ └── getepg 番組表更新の為のcronジョブ。インストール中にcronに登録するファイル
├── customReservation.php 詳細予約実行(JavaScriptから呼ばれる)
├── deleteKeyword.php キーワードの削除実行(keywordTable.phpから呼ばれる)
├── do-record.sh.friio
├── do-record.sh.pt1 PT2/PT3用に利用可能な録画スクリプト
├── do-record.sh.sample
├── do-record.sh.test
├── envSetting.php 環境設定
├── gen-thumbnail.sh
├── getepg.old.php
├── getepg.php EPG取得スクリプト
├── index.php トップページ(番組表)
├── install
│ ├── grscan.php インストール:地上デジタルチャンネルスキャン(grscanが存在するときのみ)
│ ├── step1.php インストール:ステップ1
│ ├── step2.php インストール:ステップ2
│ ├── step3.php インストール:ステップ3
│ ├── step4.php インストール:ステップ4
│ └── step5.php インストール:ステップ5
├── js
├── keywordTable.php キーワードの管理ページ
├── logViewer.php
├── mediatomb.php mediatombのDB更新スクリプト
├── postsettings.php 設定の更新(設定ページから呼ばれる)
├── programTable.php 番組検索ページ
├── recLog.inc.php
├── reclib.php 雑多ライブラリ
├── recomplete.php 録画終了フラグを立てるスクリプト
├── recordedTable.php 録画済み一覧ページ
├── recorder.php
├── reservationTable.php 予約一覧ページ
├── reservationform.php 詳細予約のフォームを返す(JavaScriptから呼ばれる)
├── sendstream.php 録画中に視聴するためのストリーミングを流すスクリプト(未完成)
├── setChannelInfo.php
├── settings
├── simpleReservation.php 簡易予約実行(JavaScriptから呼ばれる)
├── start
├── storeProgram.inc.php
├── storeProgram.php
├── systemSetting.php システム設定ページ
├── tableStruct.inc.php
├── templates
│ ├── envSetting.html 環境設定ページSmartyテンプレート
│ ├── index.html トップページSmartyテンプレート
│ ├── keywordTable.html キーワード一覧ページSmartyテンプレート
│ ├── logTable.html
│ ├── programTable.html 番組検索ページSmartyテンプレート
│ ├── recordedTable.html 録画済み一覧ページSmartyテンプレート
│ ├── reservationTable.html 予約一覧ページページSmartyテンプレート
│ ├── reservationform.html 詳細予約フォームのSmartyテンプレート
│ └── systemSetting.html システム設定ページSmartyテンプレート
├── templates_c
├── thumbs
│ └── index.html
├── upgrade_db.php
├── video
│ └── index.html
├── viewer.php ASFヘッダを送るスクリプト
└── xmlrpc.php

recpt1の使い方

開発する上で録画処理周りに手を入れる際には知っている必要があります。と言っても、地デジ/BS/CSとチャンネル番号、録画先、録画時のモードを指定するのみなので、難しい事はありません。

epgdumpの使い方

番組表を取得する為にはrecpt1で60秒~180秒程度録画したtsファイルを作成する必要があります。そのtsファイルをepgdumpコマンドに渡すと、番組表が含まれたxmlファイルが出力されると言う仕組みです。テストデータの作成の為に使うかもしれないので、頭の隅に入れておきましょう。

atコマンドの使い方

cronは良く聞くと思いますが、atコマンドはあまりなじみの無いコマンドだと思います。atは定期実行する必要はないが、決まった時間になったら一度だけ実行されるLinuxのジョブです。番組の録画は1度だけ指定日時に実行されれば良いだけなので、atコマンドが選ばれるのは至極当然ですね。

ソースコードの編集やgrepの仕方について

先人が書いたプログラムを修正する際には、ソースを読んで理解する事になるわけですが、正直、全部のソースコードを理解して、『この修正の為にはあのファイルとあのファイルを修正して~』などと言うためにはかなりの時間を費やしてソースコードと格闘した後です。最初の取っ掛かりで簡単に何かを追加したい場合には、grepで対象箇所をピックアップする必要があり、対象が見つかったらvi(実際にはvimね)で編集して動作確認を実施します。

また、本来であれば開発環境を別に用意して、テストが終わってから本番稼働しているサーバにアップロードすべきですが、今回は『やってみよう!!』と言うスタンスなので、構築済みの環境をそのまま修正します。

grepを簡単に使えるようにしておきましょう。

# 拡張子phpのファイルより、『INSTALL_PATH』を含む箇所をgrepする。
cd /var/www/epgrec

find ./ -name "*.php" | xargs grep INSTALL_PATH

vimの設定ファイルを作っておく

vimでソースコードの編集をする際に、検索時には色付けで強調表示されたり、tabがスペース何個分で表示されるか等をホームディレクトリの.vimrcファイルに設定しておきます。

vi ~/.vimrc

.vimrcの中身は各自お好きに編集してください。サンプルとして下記にも載せておきます。

filetype plugin on

setlocal omnifunc=syntaxcomplete#Complete
set fileencoding=utf-8
set fileencodings=utf-8
set syntax=on
set number
set ts=2
set sw=2
set sts=0

:set expandtab
:retab 2

簡単ですね。基本的にソースコードの編集はvimで行いますが、windowsやmacからソースを編集したい場合には、samba等で/var/www/epgrecを共有フォルダに設定してしまい、windows/macから読み書きできるようにしてしください。慣れてしまうとLinux上で操作する方が楽ですが、不慣れな場合にはLinux上からソースコードの編集をする必要性は全くありませんので。

TOPページに、『自動録画キーワード管理へ』のリンクを追加する。

最初なので、簡単な所から始めていきます。

やりたい事(仕様)を決める

現状のepgrecでは『自動録画キーワード管理へ』リンクは、番組検索ページにあり、TOPページから移動する為には1ページ余分に遷移する事になっていますので、TOPページからすぐに移動できるようにしてみます。

epgrec11

強引に動機づけしましたが、TOPページから『自動録画キーワード管理』に直接移動できるようにリンクを追加してみます。具体的には、下の図の赤枠の辺りに『自動録画キーワード』のリンクを追加する事を目的とします。

epgrec10

修正対象箇所をgrepでピックアップする

この手の画面修正をする際には、その周りにあるキーワードでgrepしてみれば良いでしょう。もちろん、経験的に『TOPページなのでindex.html辺りで、かつsmartyを使っているからtemplatesフォルダの下を見ようか』と判断しても良いです。


cd /var/www/epgrec

find ./ -name "*.html" | xargs grep "放送波選択"
./templates/index.html: <span>放送波選択</span>

templates/index.html内に該当箇所があるようです。早速対象ファイルを開いて、『放送波選択』で検索してみます。vimでは『/』を押した後に検索キーワードを入力する事で、検索できます。

epgrec12

581行目に放送波選択のキーワードがありました。その近隣を見てみると、環境設定や、強調表示等のキーワードが並んでいます。当初の目的の赤枠近辺のソースコードが解りました。

epgrec10

では、修正してみます。今回はソースコードをそのまま載せずに画像で載せておきます。修正前が下記。

epgrec13

修正後。keywordTable.phpは、番組検索ページの『自動予約キーワード管理へ』のリンクのURLを見て、そのアドレスをコピペで持って来ました。

epgrec14

ブラウザでも動作確認を行います。epgrecのTOPページに戻ってブラウザのリロードボタンを押して、キーワード予約のリンクが表示されている事を確認し、さらにそのリンクを押してみてキーワード予約画面に遷移する事を確認します。

epgrec15

第一回目終わりソースコード差分

第一回目は最初から心が折れないように簡単に結果の出るリンクの追加のみの修正としました。一番最後にソースコードの差分を出しておきます。


git diff
diff --git a/templates/index.html b/templates/index.html
index 5d9680b..b7f9da3 100755
--- a/templates/index.html
+++ b/templates/index.html
@@ -606,6 +606,7 @@ h2 {padding: 4px}
<li><a href="programTable.php">番組検索</a></li>
<li><a href="reservationTable.php">録画予約一覧</a></li>
<li><a href="recordedTable.php">録画済一覧</a></li>
+    <li><a href="keywordTable.php">キーワード予約</a></li>
</ul>
</div>

 

タグ付けされた , , , . ブックマークする へのパーマリンク.

One Response to epgrecを改造してプログラムの仕方を覚える① 準備編

  1. lasas 曰く:

    このコンテンツ、続きを早く書いてくれと急かされています。フォルダ分けは既に実現されている機能ですが、勉強がてら実装するには丁度良い機能と割り切ってやってみますか。あと、地デジ/BS/CSの中から好きな物を組み合わせてMy番組表みたいな機能があると良いですよね。tokyo MX、BS11・・・なんかを混在して1ページの番組表として見せたりとか。

コメントを残す

メールアドレスが公開されることはありません。