2012/06/01

wavecastでepgrec構築 視聴編

wavecast上でepgrec動いたので、やっぱり外からアクセスして観てみたいわけです

外からepgrecページヘアクセス

http://wavecast.tv/01/でいつものように自分のwavecastにログインして
http://(ip-address)/wave/・・・ってなるので
http://(ip-address)/epgrec にURL変更してepgrecページを表示。おぉ。出た出た。


録画済一覧ページが・・・

あらら。サムネイルがちゃんとでない。
HTMLソースを見ると・・・なるほど、ローカルIPアドレスからのURLになっている。
デフォルトのままなら「http://localhost/epgrec」かな。これでは外アクセスには不都合なので、何処かを直さなくては。
と、初めは考えてSettings.class.phpのfactory()関数で、return $obj;の直前で
$obj->install_url = "http://".$_SERVER["SERVER_NAME"]."/epgrec";
ってやれば、その時点でIPアドレスになっていいかと。実際これでもいけるけど、
せっかく設定できるようになっているのに"/epgrec"が決め打ちなのはどうなの?と思い直して、、、はたと気づいたよ。

epgrecのシステム設定で、インストールURLのところを、"/epgrec"だけにすればいいじゃん。後はブラウザが適当に補完してくれる。URLって言葉に惑わされておりました。

HTML5対応

epgrecでの視聴はasf(asx?)フォームを出力するようになっていて、PCでVLCプレイヤーとかで見るように書かれているみたいだが、wavecast同様、どんなプラットフォームでも視聴したいので、ここはちょっ手を加えてHTML5のvideoタグでの再生に対応させる。

viewer.php (再生スクリプト)を直接書き換えればいいんだろうけど、元ソースをできるだけいじりたくないので、別ファイルに。

viewer_html5.phpというファイルを作成して、再生時にこっちが使われるように
recordedTbl.php (録画一覧スクリプト)ないで、
$arr['asf'] = "".$settings->install_url."/viewer.php?reserve_id=".$r->id;

$arr['asf'] = "".$settings->install_url."/viewer_html5.php?reserve_id=".$r->id;
と書き換える。
これでサムネイルとかクリックするとviewer_html5.phpの方が使わる。
viewer_html5.php の中身は一応こんな感じ。
<?php
//「セッションの有効期限をプライベートに調整する」ってことらしい
ini_set('session.cache_limiter', 'private');
session_start();


//キャッシュを無効
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


include_once("config.php");
include_once(INSTALL_PATH . "/DBRecord.class.php" );
include_once(INSTALL_PATH . "/Settings.class.php" );


$settings = Settings::factory();


if( ! isset( $_GET['reserve_id'] )) jdialog("予約番号が指定されていません", "recordedTable.php");
$reserve_id = $_GET['reserve_id'];


try{
$rrec = new DBRecord( RESERVE_TBL, "id", $reserve_id );
$src = $settings->install_url.$settings->spool."/".$rrec->path;
//$src = "/epgrec".$settings->spool."/".$rrec->path;
}
catch(exception $e ) {
exit( $e->getMessage() );
}
?>


<!doctype html>
<html lang="ja">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body style="padding: 0px; margin: 0px; background-color: black;" >
    <div style="vertical-align:middle;">
      <video src="<?php print $src ?>" width="100%" preload="none" autoplay autobuffer controls onclick="this.play();"/>
    </div>
  </body>
</html>

これで手持ちのデバイスから視聴が出来るようになりました!

しかし残念ながら、iOSとAndroidではオートプレイが効きませんな。色んなサイトの記事で書かれている方法を幾つか試してみたんだけどダメ。wavecastからは出来てるんだけどなぁ。この辺はもう少し勉強して試行錯誤するか。
それに結果的に一番良く使っているiPodTouch初代では見れない。対応させたソース設定とか必要なんだろうね。この辺も改良の余地あり。

WAVECASTメニューに統合

冒頭に書いた、http://(my-global-ip)/epgrec にURL変更してepgrecページを表示って手順を踏むのがとても面倒なのでWAVECASTメニューページからepgrecのページヘ飛ぶボタンを付けてみた。

/home/wave/wave/jp/menu.php に、以下の記述を追加しました。
具体的には、<div class="info">・・・</div>の後。
<div class="toolbar">
  <h1>EPGREC メニュー</h1>
</div>
<table bgcolor=black width=100%>
  <tr>
    <td><ul class=edgetoedge><li><a href=../../epgrec/recordedTable.php rel=external>録画リスト</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/reservationTable.php rel=external>予約リスト</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/programTable.php rel=external>番組検索</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec rel=external>番組表</a></td>
  <tr>
    <td><ul class=edgetoedge><li><a href=../../epgrec/keywordTable.php rel=external>自動登録</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/envSetting.php rel=external>環境設定</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/systemSetting.php rel=external>システム設定</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/logViewer.php rel=external>動作ログ</a></td>
</table>

menu.phpからの相対パス(../../epgrec)でいける。
rel=externalを付けないと、AndroidやiOSだと飛んでくれないんだね。変な感じ。そういうことならと思って、target="_blank"ってやってみたら、いけるんだけど、今度はPCのブラウザだと別ページになっちゃう。なるほど、そういう事か。

wavecastのページはjQTouchで構成されているので、div,ul,liのclass指定で簡単にデザインを変更できて良い感じ。

こんな感じになりました。各ページヘの直リンクボタンで操作性微妙に向上。

4 件のコメント:

  1. 2012年の記事なので、もうEPGrecは使ってないかもしれませんが、PHP7に移行した経験があれば教えてください。mysqliに書き換えて一応録画できる状態にはなったのですが、動作ログが見れない等の不具合があって、修正点を模索中です。

    返信削除
  2. EPGrecは当時試しに入れてみただけでして・・・
    今は、epgdump+recfsusb2n+自作録画システム(RoR)のため、PHPとも縁遠い状態。
    お力になれず申し訳ありません。

    返信削除
    返信
    1. 了解です。返信してもらって結構うれしいです。わははは。

      削除
  3. EPGrecのPHP7対応の追伸です。
    Googleで実験室にたどり着いた人の為にメモっておきます。

    すべてのmsql_関数は、mysqli_に置き換えることでPHP7で動きます。
    fetch内のMYSQL_ASSOCをMYSQLI_ASSOCにするのも忘れずに。

    このままでは、録画一覧と予約語登録が動きませんでした。

    mysqli_connect_error()をmysqli_connectの直後に入れて状態をみたところ、
    Too many connectionsで停止しているのが分りました。
    EPGrecのコーディングでは、録画済みの番組数分のmysql connectionが必要な様です。1つのコネクションで処理する様に書き直そうと思ったのですが、時間もないので、コネクション数を増やす対応にしました。

    mysql.cnfに以下の様に追加しましたが、251以上に増やせませんでした。
    [mysqld]
    max_connections=450

    mysqlに入って、以下のコマンドで増やしています。
    mysql> set global max_connections=450;

    コネクション数が多すぎて動作がもっさりしますが、とりあえずPHP5の時代と同じ様に動くようになりました。

    返信削除