チェンジセット 83

差分発生行の前後
無視リスト:
コミット日時:
2008/12/30 22:12:46 (16 年前)
コミッタ:
sorshi
ログメッセージ:

foltiaHD最初のリリース。
デジタル録画はFriio/Friio BS/CSのみに対応。
ivtvは1.0系使用になりました。

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/doc/index.html

    r78 r83  
    3232  番組名と放映局を指定しておけばあとはなにもせずに毎回録画されます。<a href="http://cal.syoboi.jp/">しょぼいカレンダー</a>というアニメ番組表サイトと強く連係することで、野球中継で時間がずれても毎回期待通り録画されます。<br /> 
    3333    
    34   外部オプションを取り付けることで外付けチューナのコントロールも実現します。<br /> 
    35    録画した番組は自動的にMPEG4に変換され、iPodに自動転送することが可能です。PSPに転送して視聴することも可能です。<br /> 
     34  外部オプションを取り付けることで外付けチューナのコントロールも実現します。適切な録画装置を組み合わせることでハイビジョン録画も実現します。<br /> 
     35   録画した番組は自動的にH.264/AVCに変換され、iPodに自動転送することが可能です。PSPに転送して視聴することも可能です。<br /> 
    3636 全ての主要操作はWebベースでコントロールされます。</p> 
    3737<p><br /> 
     
    4242  <li>番組名によるアニメ自動録画機能 
    4343    <ul> 
    44       <li>最大6番組までの同時録画対応</li> 
     44      <li>最大6番組までの同時録画対応(アナログ)</li> 
     45      <li>ハイビジョンデジタル録画(同時録画数:デバイス認識するだけ)</li> 
    4546    </ul> 
    4647  </li> 
    4748  <li>EPG番組表による番組選択録画機能</li> 
    4849  <li>開始時刻、放送局など個別設定による手動録画機能</li> 
     50  <li>iPhoneではシンクされてない番組でも専用画面でストリーミング視聴可能 </li> 
    4951  <li>USBリモコンユニットを使った外部チューナー制御機能</li> 
    50   <li>録画終了と同時にMPEG2からH.264/AVCへの自動変換機能(iPod Video、PSP、Webブラウザなどで視聴可能形式) </li> 
    51   <li>video podcastのしくみを使ったiPod自動シンク機能 
     52  <li>録画終了と同時にMPEG2からH.264/AVCへの自動変換機能(iPod 、PSP、Webブラウザなどで視聴可能形式) </li> 
     53  <li>video podcastの仕組を使ったiPod自動シンク機能 
    5254    <ul> 
    53       <li> 録画番組は自動的にiPodに転送されて視聴可能状態となる<br /> 
     55      <li> 録画番組は自動的にiPodに転送されて視聴可能状態となる<br /> 
    5456                <a href="img/foltia_vodcast.jpg"><img src="img/foltia_vodcast_s.jpg" width="320" height="240" border="2" /></a><br /> 
    5557      </li> 
    5658    </ul> 
    57   <li>現在開発中のツール「Starlight Breaker」向け番組キャプチャ画像自動生成機能</li> 
     59  <li>付属モジュール「Starlight Breaker」向け番組キャプチャ画像自動生成機能 
     60    <ul> 
     61      <li>Starlight BreakerはWordPressやMovable TypeなどにXMLRPCを使ってかんたんにアニメブログを投稿する機能</li> 
     62    </ul> 
     63  </li> 
     64  <li>環境ポリシーによるマルチユーザ対応 
     65    <ul> 
     66      <li>アカウントにより各段階のアクセス権を設定可能</li> 
     67    </ul> 
     68  </li> 
    5869  </li> 
    5970</ul> 
     
    6172<h2 id="requirementhardware">・必要ハードウェア</h2> 
    6273<ul> 
    63   <li>Linuxの動くAT互換機:手もと開発・録画機はCeleron 2.6GHz,1GB RAMのスペックで30分番組のH.264/AVC(中画質)変換が33分程度で完了しています。</li> 
    64   <li>ivtvドライバで動作するビデオキャプチャカード:foltiaの機能を引きだすためには複数のエンコーダを搭載するのがおすすめです。手もとの環境ではIOデータ <a href="http://www.iodata.jp/prod/multimedia/tv/2003/gv-mvprx/">GV-MVP/RX</a>を2枚、<a href="http://www.iodata.jp/prod/multimedia/tv/2004/gv-mvprx2w/index.htm">GV-MVP/RX2W</a>を1枚で計4チャンネル同時録画環境にしています。画質の点からは複数エンコーダが一枚のカードに載ったRX2Wよりも1エンコーダのGV-MVP/RX2の方が多少有利なようです。</li> 
     74  <li>Linuxの動くAT互換機:筆者の環境ではPentium4(2.8GHz)/2GB RAMの環境で30分番組のハイビジョンTSをデフォルト設定でH.264にトランスコードするのに約90分程度で完了しています。</li> 
     75  <li>Friioなどのデジタルハイビジョン録画デバイス:HDUSもLinuxで動いているようですが未テストです。PT1は絶賛解析中らしいです。期待して待ってましょう。</li> 
     76  <li>(アナログ録画をする場合)ivtvドライバで動作するビデオキャプチャカード:foltiaの機能を引きだすためには複数のエンコーダを搭載するのがおすすめです。手もとの環境ではIOデータ <a href="http://www.iodata.jp/prod/multimedia/tv/2003/gv-mvprx/">GV-MVP/RX</a>を2枚、<a href="http://www.iodata.jp/prod/multimedia/tv/2004/gv-mvprx2w/index.htm">GV-MVP/RX2W</a>を1枚で計4チャンネル同時録画環境にしています。画質の点からは複数エンコーダが一枚のカードに載ったRX2Wよりも1エンコーダのGV-MVP/RX2の方が多少有利なようです。</li> 
    6577 <div class="sidebar"> 
    6678 IOデータ GV-MVP/RX,RX2は生産完了になり、後継として<a href = "http://www.iodata.jp/prod/multimedia/tv/2005/gv-mvprx3/index.htm">GV-MVP/RX3</a>が出ています。しかしGV-MVP/RX3はMPEG2エンコーダが変更になったため今のところ対応ドライバがありません。<br /> 
     
    8496  放映テレビ局とビットレートを選択する画面に移動するので内容を確認して予約ボタンを押します。番組の録画予約は番組ごとに一度するだけで全話自動で録画することが可能です。<br /> 
    8597  <br /> 
    86   <img src="img/screen02.png" width="800" height="600" /><br /> 
     98  <img src="img/screen02.png" width="800" height="500" /><br /> 
    8799  <br /> 
    88100   予約ボタンを押すとデータベースの録画予約テーブル[foltia_tvrecord]に番組IDと放送局、録画ビットレートが追加されます。その後、キュー入れプログラム[addatq.pl]を呼びます。addatq.plは番組IDと局IDを受け取り48時間以内の放映予定を探し、それぞれの放映ごとに録画準備のためのプログラム[folprep.pl]を放送予定時刻の5分前にキュー入れします。<br /> 
    89101   予約番組の放送予定時刻の5分前になると、準備プログラム[folprep.pl]が実行されます。これは、最新の番組表データを再取得し、放映時刻が変更されてないか確認後、放送開始時刻の1分前に録画プログラム[recwrap.pl]が走るようにキューを入れます。放送時刻が15分以上先に延びていたら、再度放送予定時刻の5分前に準備プログラム[folprep.pl]をキュー入れします。<br /> 
    90    放送予定時刻の1分前になると録画の一連の流れを管理する録画プログラム[recwrap.pl]が起動します。このプログラムは、録画チャンネルが外部入力であれば外部チューナのチャンネルを適切なものに切り替えるためにリモコン送信プログラム[transfer.pl]を呼びだし、次に実際にビデオでバイスからファイルへの記録を行うキャプチャプログラム[tvrecording.pl]を呼び出します。<br /> 
    91    キャプチャプログラム[tvrecording.pl]はivtvドライバに付属のrecord-v4l2.plをベースに拡張したもので、搭載されている録画デバイスの空き状況を調べて、空いてる適切なデバイスを利用します。foltiaは特に指定をしない場合、同時録画する場合、地上波録画をキャプチャデバイスの若い番号から順番に、外部入力を一番大きいデバイスから順番に使用していきます。例としてキャプチャカードが4枚入っている場合、地上波録画は/dev/video0から、外部入力録画は/dev/video3から使われていきます。空きデバイスがない場合は、一番若い番号を持つビデオデバイスをつかんでるプロセスを止め、そのデバイスを利用します。録画は前後に10秒程度の余分な録画を行おうとするため、同一のチャネルで連続している番組を指定した場合であっても可能であれば2チューナ使用する形となります。tvrecording.plの録画チャンネルの引数に0を指定した場合はS入力が、-1を指定した場合はコンポジット入力が録画されます。外部入力はデフォルトで一番番号の大きいデバイスを利用します。録画が終了するとデータベースの放送情報テーブル[foltia_subtitle]に録画したMPEG2ファイル名を記録して親プロセスに戻ります<br /> 
    92    録画プログラムが終了すると、親プロセスのrecwrap.plはMPEG4への変換(トラコン)の必要があるか確認して、必要な場合変換スクリプト[vfr4psp.sh]か[ipodtranscode.pl]が呼び出されます。変換フォーマットや品質は設定ファイルであらかじめ設定しておきます。MPEG4ファイルは、MPEG2ファイル保存ディレクトリの下に番組ごとに整理されます。具体的には[TID].localized/mp4/の形を取ります。番組個別ディレクトリはMac 
     102 放送予定時刻の1分前になると録画の一連の流れを管理する録画プログラム[recwrap.pl]が起動します。このプログラムは、録画チャンネルが外部入力であれば外部チューナのチャンネルを適切なものに切り替えるためにリモコン送信プログラム[transfer.pl]を呼びだし、次に実際にビデオでバイスからファイルへの記録を行う録画プログラム[digitaltvrecording.pl]か[tvrecording.pl]を呼び出します。デジタル録画出来るデバイスが不足した場合は利用可能なアナログ録画デバイスがあればそちらで録画を実行するように努力します。<br /> 
     103 [digitaltvrecording.pl]は実際の録画プログラムを呼び出します。BS1/BS2はwineを利用してTsSplitter.exeを起動して適切な分割処理をします。<br /> 
     104   アナログ録画の場合はキャプチャプログラム[tvrecording.pl]はivtvドライバに付属のrecord-v4l2.plをベースに拡張したもので、搭載されている録画デバイスの空き状況を調べて、空いてる適切なデバイスを利用します。foltiaは特に指定をしない場合、同時録画する場合、地上波録画をキャプチャデバイスの若い番号から順番に、外部入力を一番大きいデバイスから順番に使用していきます。例としてキャプチャカードが4枚入っている場合、地上波録画は/dev/video0から、外部入力録画は/dev/video3から使われていきます。空きデバイスがない場合は、一番若い番号を持つビデオデバイスをつかんでるプロセスを止め、そのデバイスを利用します。録画は前後に10秒程度の余分な録画を行おうとするため、同一のチャネルで連続している番組を指定した場合であっても可能であれば2チューナ使用する形となります。tvrecording.plの録画チャンネルの引数に0を指定した場合はS入力が、-1を指定した場合はコンポジット入力が録画されます。外部入力はデフォルトで一番番号の大きいデバイスを利用します。<br /> 
     105    
     106  録画が終了するとデータベースの放送情報テーブル[foltia_subtitle]に録画したMPEG2ファイル名を記録して親プロセスに戻ります<br /> 
     107   録画プログラムが終了すると、Starlight Breaker用キャプチャ画像をmplayerを利用して作成し、親プロセスの[recwrap.pl]はMPEG4への変換(トラコン)の必要があるか確認して、必要な場合変換スクリプト[ipodtranscode.pl]が呼び出して自分は終了します。変換フォーマットや品質は設定ファイルであらかじめ設定しておきます。MPEG4ファイルは、MPEG2ファイル保存ディレクトリの下に番組ごとに整理されます。具体的には[TID].localized/mp4/の形を取ります。番組個別ディレクトリはMac 
    93108  OS Xのローカライズ機構に準拠しているため、例えば665.localizedディレクトリはMac OS XのFinderでマウントすると「魔法少女リリカルなのはA's」と表示されます。<br /> 
    94    MPEG4への変換が終わるとpsp用MPEG4オプティマイザ[mp4psp]でタイトル入れとヘッダ組み立てをして最適化したあと、mplayerとImageMagickを利用してサムネールを作成します。サムネールはPSPの仕様に準拠して120x160で拡張子が.THMのjpegファイルです。そしてデータベースの放送情報テーブル[foltia_subtitle]に変換ファイル名を書き込んで録画の一連の流れが終了します。<br /> 
    95   図に示すとこうなります。<br /> 
     109   [ipodtranscode.pl]は起動されると録画が古い順に順番にトラコンを実行し、サムネールを作成して、すべての録画ファイルを変換すると終了します。サムネールはPSPの仕様に準拠して120x160で拡張子が.THMのjpegファイルです。そしてデータベースの放送情報テーブル[foltia_subtitle]に変換ファイル名を書き込んで録画の一連の流れが終了します。<br /> 
     110  図に示すとこうなります。(ごめん、ちょっと古いまま)<br /> 
    96111  <img src="img/blockdiagram.png" width="800" height="399" /> <br /> 
    97112</p> 
     
    113128<hr> 
    114129<h2 id="install">・インストール</h2> 
    115 <p> foltiaの動作にはLinux,Apache,PHP,Perl,PostgreSQLとビデオキャプチャ用ivtvドライバなどが必要です。<br /> 
     130<p> foltiaの動作にはLinux,Apache,PHP,Perl,PostgreSQLと録画プログラム、mplayer,ffmpeg,faac,iui,などが必要です。<br /> 
    116131   インストールはおおまかにOS,Apache,ivtvドライバ、PostgreSQL、foltiaの順で進めて行くとよいでしょう。<br /> 
    117132   phpPgAdminやSambaなども必要に応じて入れておくと便利かもしれません。<br /> 
    118  foltiaのダウンロードは公式ページまたはSubversionで入手することが可能です。<br /> 
     133   foltiaのダウンロードは公式ページのtarボールまたはSubversionで入手することが可能です。<br /> 
    119134 Subversionを使う場合は下記のコマンドで最新versionを入手できます。</p> 
    120135<p class="command">$svn co http://svn.dcc-jpl.com/foltia/trunk  foltia</p> 
    121 <p class="screen">またインストールについては「<a href="manual/index.html">foltiaインストールマニュアル</a>」も参考になります。</p> 
     136<p class="screen">またインストールについては「<a href="manual/index.html">foltiaインストールマニュアル</a>」も参考になります。(内容はやや古くなっています)</p> 
    122137<h3>・配線</h3> 
    123 <p> あらかじめキャプチャカードを取り付け、に外部チューナを外部入力端子につないでおきます。</p> 
     138<p> あらかじめキャプチャカード、録画装置を取り付け、アンテナ線をつなぎ、外部チューナを外部入力端子につないでおきます。</p> 
    124139<h3>・OSインストール</h3> 
    125 <p> 手もとの開発環境ではFedora Coreを使っています。一通りインストールを終えたらfoltiaを動作させるアカウント「foltia」を作ります。</p> 
     140<p> 筆者の環境ではFedora Coreを使っています。一通りインストールを終えたらfoltiaを動作させるアカウント「foltia」を作ります。</p> 
    126141<h3>・Apacheインストール</h3> 
    127142<p>Apacheは2.2以降が2GBを越えるファイルの転送にも対応していて便利です。<br /> 
    128143  ポイントは、Apacheを動かすユーザをfoltiaにすることと、「.THM」のmime typeをimage/jpegにする設定を追加することです。</p> 
    129144<h3>・ivtvドライバインストール</h3> 
    130 <p>「<a href="http://linux.matchy.net/FedoraGV-MVPRX.html">FEDORA 
    131   CORE で GV-MVP/RX を使う</a>」のrpmパッケージを使用すると早いです。<br /> 
    132   複数エンコーダを搭載している場合には/etc/modprobe.confに<br /> 
    133   <span class="screen">options ivtv tuner=46,46</span><br /> 
    134   と、エンコーダの数だけ「46」を書き足します。<br /> 
    135   ビデオキャプチャデバイスが利用できるようになったら<br /> 
    136   <span class="screen">chmod 0666 /dev/video*</span><br /> 
    137   でroot以外でも利用できるようにパーミッションを変更します。</p> 
     145<p>最近のLinuxのディストリビューションだと標準で使えるようになっていることが多いようです。</p> 
    138146<h3>・PostgreSQLインストール</h3> 
    139147<p>ポイントは文字コードをEUC-JPでデータベースをつくることです。foltiaという名前でデータベースを作ったら、foltiaパッケージ付属のmktable.txtでテーブルを作成します。</p> 
    140 <h3>・各種ツールインストール</h3> 
     148<h3>・各種アプリインストール</h3> 
    141149<p>以下のアプリケーションを利用します。インストールされてなければyumやaptなどからインストールして下さい。 
    142150<br /> 
    143   mplayer:サムネール作成に利用<br /> 
    144 ImageMagick:サムネール作成に利用</p> 
     151  mplayer:サムネール作成、トラコンに利用<br /> 
     152ImageMagick:サムネール作成に利用 
     153<br /> 
     154wine:TS分割ツールTsSplitter起動に利用 
     155<br /> 
     156<a href="http://gpac.sourceforge.net/index.php">MP4Box</a>:各トラックをまとめてMP4ピルドに利用</p> 
    145157<h3>・各種Perlモジュールのインストール</h3> 
    146158<p>以下のPerlモジュールを利用します。インストールされてなければCPANなどからインストールして下さい。<br /> 
     
    153165<p>EPG番組表取得に必要なXMLTV日本語版をインストールします。<a href="http://linux.paken.org/index.php?XMLTV%C6%FC%CB%DC%C2%D0%B1%FE%C8%C7">ぱ研</a>が制作したものがすでに本家にマージされているようです。</p> 
    154166<h3>・ffmpegインストール</h3> 
    155 <p>iPod H.264/AVCを作れる拡張をされたffmpegをインストールします。<br /> 
     167<p>最近のffmpegはiPod用H.264作成オプション(-f ipod)をもっていますが、ディストリビューション付属のffmpegがうまく動かなかったら作り直してインストールします。<br /> 
    156168  <br /> 
    1571691.ffmpegのソースを入手する 
    158 <p class="command">$svn checkout --revision {"2006-03-28 22:00"} svn://svn.mplayerhq.hu/ffmpeg/trunk 
     170<p class="command">$svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk 
    159171ffmpeg  
    160 <p>2.ここにあるiPodパッチをあてる<br> 
    161   <a href = "http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2006-March/009814.html" target = "_blank">http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2006-March/009814.html</a><br><br> 
    162  環境によっては更にx264.cのアップデートが必要という情報が寄せられた。(From <a href="http://www.dcc-jpl.com/soft/foltia/bbs/minibbs.php">foltia BBS TTTさん</a>) 
    163 <p class="command">svn cat --revision 6711 ffmpeg/libavcodec/x264.c > ffmpeg/libavcodec/x264.c</p> 
    164  3.メイクする<br> 
     172<p>2.メイクする<br> 
    165173  手もとでは下記オプションでビルドしています。 
    166 <p class="command">$./configure --enable-mp3lame --enable-x264 --enable-gpl --enable-a52 
    167 --enable-xvid --enable-faac --enable-faad --enable-amr_nb --enable-amr_wb --enable-pthreads 
     174<p class="command">$./configure --enable-libmp3lame --enable-libx264 --enable-libxvid 
     175  --enable-libfaac --enable-libfaad --enable-pthreads --enable-gpl 
    168176<h3>・foltia本体</h3> 
    169177<p>installディリクトリの中にある「perl」と「php」をそれぞれ適当なところに配置します。<br /> 
    170178  手もとの環境では/home/foltia/perl/と/home/foltia/php/に配置しています。</p> 
    171 <h3>・mp4psp</h3> 
    172 <p>MPEG4のトラコンに利用しているツール「mp4psp」をインストールします。「<a href="http://hetima.com/">ヘチマコンピュータ</a>」によって作られたコードの「<a href="http://www.kokone.to/~kgt/diary.shtml?200501#23_3_1">作業日誌と云う名の不定記 
    173   2005/01/23</a> 」によるLinux版をベースにしたツールです。PSP用にタイトルを入力してATOMヘッダを組み立てて最適化するのに使用します。またファーストスタート形式にも最適化します。</p> 
     179 <h3>・各種ツールインストール</h3> 
     180<p>以下のプログラムを利用します。<br /> 
     181recfriio:Friioを使ったデジタルハイビジョン録画に利用 http://2sen.dip.jp/cgi-bin/friioup/source/up0777.zip 
     182<br /> 
     183TsSplitter:MPEG-2 
     184TS streamを分割するwindows用プログラム http://2sen.dip.jp/cgi-bin/friioup/source/up0827.zip<br /> 
     185<a href="http://allegro.10.dtiblog.com/blog-entry-177.html">tss.py</a>:TSを分割するPythonスクリプト、正確にはHD以外のストリームを捨てるスクリプト<br /> 
     186<a href="http://www.nero8.com/jpn/nero-aac-codec.html">Nero AAC コーデック</a>:オーディオトラックのAACエンコードに使う。FAACと比べて品質がとても良い。<br /> 
     187上記のneroAacEnc, 
     188recfriio, 
     189TsSplitter.exe,tss.pyは~/perl/tool/あたりに入れて下さい。<br /> 
     190  <a href="http://code.google.com/p/iui/"><br /> 
     191  iui</a>:iPhone用UIライブラリ <br />  
     192  iuiは~/php/iui/として入れて下さい。</p> 
     193 
    174194<h3>・外部チューナコントロール(オプション)</h3> 
    175195<p>Home Electronics社製USB 赤外線トランスミッタ <a href="http://www.home-electro.com/tira2.php">Tira-2.1</a>を利用することにより、外部チューナのコントロールを行うことが可能です。<br /> 
     
    186206  <span class="screen"><br /> 
    187207  $recunits = '4';<br /> 
    188   </span>搭載エンコーダの数。GV-MVP/RX2Wを一枚刺しの場合は2になります。<br /> 
     208  </span>アナログ録画の設定です。搭載エンコーダの数を指定します。GV-MVP/RX2Wを一枚刺しの場合は2になります。デジタルハイビジョン録画のみの場合は0になります。<br /> 
    189209  <br /> 
    190210  <span class="screen">$recfolderpath = '/home/foltia/php/tv';<br /> 
     
    192212  <br /> 
    193213  <span class="screen">$uhfbandtype = 0;<br /> 
    194   </span>UHF帯なら0、CATVなら1を指定します。それぞれivtvのntsc-bcast-jpとntsc-cable-jpに対応します。<br /> 
     214  </span>アナログ録画の設定です。UHF帯なら0、CATVなら1を指定します。それぞれivtvのntsc-bcast-jpとntsc-cable-jpに対応します。<br /> 
    195215  <span class="screen"><br /> 
    196216  $rapidfiledelete = 1;</span><br /> 
    1972171なら削除ファイルは「mita」ディレクトリに移動、0なら即時削除します。mitaディレクトリはゴミ箱のように機能しますが自動的に削除はしません。らくちんな運用をしたければ0、安全のため保存しておきたければ1でよいでしょう。</p> 
    198 <p><span class="screen">$tunerinputnum = 6;<br /> 
    199   $svideoinputnum = 7;<br /> 
    200   $comvideoinputnum = 8;</span><br /> 
     218<p><span class="screen">$tunerinputnum = 0;<br /> 
     219  $svideoinputnum = 1;<br /> 
     220  $comvideoinputnum = 2;</span><br /> 
    201221  上記3行にキャプチャカードごとに固有な映像入力のパラメータを示すivtvのinput numperを指示します。それぞれ、チューナ入力、S映像入力、コンポジット入力を指定します。デフォルトはIO 
    202   DATA製 GV-MVP/RX,RX2,RX2Wカードで利用できる設定となっています。<br /> 
    203 カード固有の値を調べるにはivtvドライバをインストールした状態で</p> 
    204 <p><span class="command">$/usr/bin/ivtvctl.paken 
    205   --list-inputs --device=/dev/video0</span></p> 
    206 <p>などで可能です。<br /> 
     222  DATA製 GV-MVP/RX,RX2,RX2Wカードで利用できる設定となっています。 
     223  <br /> 
    207224  <span class="screen"><br /> 
    208225  $haveirdaunit = 1;</span><br /> 
     
    216233  <span class="screen">$trconqty = 2;</span><br /> 
    217234  MPEG4変換の品質を指定します。デフォルトはH.264/AVCの中画質となっています。<br /> 
    218   3の高画質はファイルサイズは小さく画質もよいのですが処理時間がかかりすぎているのでデフォルトには指定していません。<br /> 
    219   手もとのCeleron2.6GHzのパソコンで、3の設定で実尺の3.4倍、2の設定で1.1倍、1の設定で0.77倍位の処理時間で完了しています。<br /> 
    220   0:PSP/iPod XviD MPEG4(旧式):faacとMPEG4IPを使って変換<br /> 
    221   1:iPod Xvid MPEG4 標準画質 15fps 300kbps<br /> 
    222   2:iPod H.264 中画質 24fps 300kbps<br /> 
    223   3:iPod H.264 高画質 30fps 300kbps<br /> 
    224   4:iPhone/iPod 480x320 H.264 高画質 24fps 350kbps<br /> 
    225   5:iPhone/iPod 480x320 H.264 高画質 30fps 350kbps<br /> 
     235デフォルトでバランスのよい2が選択されています。<br /> 
     236アナログソースとデジタルソースで設定が若干異なります。<br /> 
     237アナログソースでは 
     238手もとのCeleron2.6GHzのパソコンで、3の設定で実尺の3.4倍、2の設定で1.1倍、1の設定で0.77倍位の処理時間で完了しています。<br /> 
     2390:PSP/iPod XviD MPEG4(旧式):faacとMPEG4IPを使って変換(古い設定)<br /> 
     240  1:iPod Xvid MPEG4 標準画質 15fps 300kbps / デジタル  360x202 24.00fps 300kbps<br /> 
     241  2:iPod H.264 中画質 24fps 300kbps / デジタル  360x202 24.00fps 300kbps<br /> 
     242  3:iPod H.264 高画質 30fps 300kbps/ デジタル 480x272  29.97fps 400kbps<br /> 
     243  4:iPhone/iPod 480x320 H.264 高画質 24fps 350kbps / デジタル  640x352 29.97fps 600kbps 
     244  <br /> 
    226245  <br /> 
    227246  <span class="screen">$phptoolpath = $toolpath ;</span><br /> 
     
    250269<h4>・設定3:foltia_stationテーブル</h4> 
    251270<p>録画の重要な設定となる項目です。インストールが無事に終了してれば首都圏の放送局設定サンプルが入っていますのでそれを参考に設定して下さい。<br /> 
    252   foltia_stationテーブルのそれぞれの項目について説明します。<br /> 
     271  foltia_stationテーブルのそれぞれの項目について説明します。しょぼいカレンダーの情報によって放送局は自動的に追加されていきます。<br /> 
    253272  <br /> 
    254273  <span class="screen">stationid</span>:ユニークなID値です。<br /> 
     
    266285  foltia_epgにデータがインポートされていて<br /> 
    267286  3.foltia_stationテーブルのontvcodeフィールドにfoltia_epgテーブルのontvchannelフィールドと同じ放送局識別名が記入されている<br /> 
    268   局になります。デフォルトで関東キー局とBS、BSデジタル局、CS局が設定されています。</p> 
     287  局になります。デフォルトで関東キー局とBS、BSデジタル局、CS局が設定されています。<br /> 
     288  <span class="screen">digitalch</span>:地デジの物理チャンネルを入れます。BSデジタルは日本全国共通なので変更の必要はありません。<br /> 
     289<span class="screen">digitalstationband:</span>地デジなら0、BSデジタルなら1、CSデジタルなら2を入れます。(現在未使用)</p> 
    269290<h3>・Tira2準備(オプション)</h3> 
    270291<p> USBトランスミッタであるTira2を動作させるために必要な準備を行います。<br /> 
     
    276297<h3>・動作確認</h3> 
    277298<p> ここまで設定できたらあと一息で完了します。まず単純な録画ができるか動作確認していきましょう。<br /> 
     299  【デジタルハイビジョン編】<br /> 
     300~/perl/toolにインストールしたrecfriioが正しく動作するか確かめます。</p> 
     301<p><span class="command">recfriio --b25 27 60 /home/foltia/php/tv/test-mpeg2-ts.m2t </span></p> 
     302<p>これで27チャンネルのvlcで視聴出来る状態のMPEG2-tsファイルが60秒ぶん、指定した位置にでき上がれば録画成功です。<br /> 
     303  エラーがでた場合はインストールを見直して下さい。<br /> 
     304  【アナログ編】<br /> 
    278305   最初に</p> 
    279306<p><span class="command">$head /dev/video0</span></p> 
     
    281308   つぎに、録画試験を~/perl/tvrecording.plを使って行います。</p> 
    282309<p><span class="command">$./tvrecording.pl 1 60 0 test.m2p 5 0 0 /dev/video0</span></p> 
    283 <p>としてみましょう。この例は1chを60秒5Mbpsでtest.m2pというファイル名で/dev/video0から録画することを意味しています。2分程度でプロンプトに戻ります。録画ファイル保存フォルダ(デフォルトだと/home/foltia/tv/)にtest.m2pが出来ていて、ファイルを再生して期待通りならば第1段階成功です。うまくいかなかった場合には~/debug.txtに書かれる情報も参考にして原因を突き止めて下さい。<br /> 
     310<p>としてみましょう。この例は1chを60秒5Mbpsでtest.m2pというファイル名で/dev/video0から録画することを意味しています。2分程度でプロンプトに戻ります。録画ファイル保存フォルダ(デフォルトだと/home/foltia/tv/)にtest.m2pが出来ていて、ファイルを再生して期待通りならば第1段階成功です。うまくいかなかった場合には~/debug.txtに書かれる情報も参考にして原因を突き止めて下さい。</p> 
     311<p><br /> 
    284312   つぎに、しょぼいカレンダーから番組データをインポートできるかを確認します。</p> 
    285313<p><span class="command">$./perl/getxml2db.pl</span></p> 
     
    287315   ここまでできたらWebブラウザでインストールしたphpのディレクトリを開いてみましょう。<br /> 
    288316  <img src="img/screen03.png" width="800" height="600" /><br /> 
    289    番組表が表示されているのが確認できます。実際に予約をして見ましょう。一番左のTIDの数字をクリックするとそのタイトルの予約画面になります。例では690のCanvas2 
    290   〜虹色のスケッチ〜をクリックした画面です。<br /> 
    291   <img src="img/screen04.png" width="800" height="600" /><br /> 
    292    放送局とビットレートを選択して予約を押すと予約キューが入ります。放送局の設定で[全局]を選択すると文字通り放送スケジュールが入ってる局を全局録画しようとします。いまのところ受信可能不可能に関係なく録画します。想定してる用途は『千葉テレビとテレビ埼玉とtvkでリリカルなのはA'sを録画しておこう!』というものではなくしょぼいカレンダーが持つ*声優関連*や*アニメ特番*などの放送局が特定できない番組グループを録画するためのものです。<br /> 
     317   番組表が表示されているのが確認できます。実際に予約をして見ましょう。一番左のTIDの数字をクリックするとそのタイトルの予約画面になります。例は画面外の1546版のマリア様がみてる  4thシーズンをクリックした画面です。<br /> 
     318  <img src="img/screen02.png" width="800" height="500" /><br /> 
     319   放送局を選択して予約を押すと予約キューが入ります。デジタル録画優先オプションとアナログビットレートは必要に応じて変更して下さい。放送局の設定で[全局]を選択すると文字通り放送スケジュールが入ってる局を全局録画しようとします。想定してる用途は『千葉テレビとテレビ埼玉とtvkでリリカルなのはA'sを録画しておこう!』というものではなくしょぼいカレンダーが持つ*声優関連*や*アニメ特番*などの放送局が特定できない番組グループを録画するためのものです。<br /> 
    293320   予約が完了したらシェルでatqコマンドでキューが入ったを確認します。</p> 
    294321<p class="command">$atq<br /> 
    295 182194 2006-01-31 00:40 a foltia</p> 
     322182194 2009-01-08 01:10 a foltia</p> 
    296323<p>放映予定の5分前に起動するプロセスが入ってることが確認できます。<br /> 
    297   この例だと00:40にfolprep.plが起動します。<br /> 
     324  この例だと01:10にfolprep.plが起動します。<br /> 
    298325  folprep.plが起動すると放映予定1分前にrecwrap.plがキューに入ります。</p> 
    299326<p class="command">$atq<br /> 
    300   182195 2006-01-31 00:44 a foltia</p> 
    301 <p> 番組が終了したらMPEG2が録画されたか確認してみましょう。デフォルトで~/php/tv/690-16-20060131-0045.m2pというファイルが出来ているはずです。ファイル名はそれぞれ以下のルールで命名されます。<br /> 
     327  182195 2009-01-08 01:14 a foltia</p> 
     328<p> 番組が終了したらMPEG2が録画されたか確認してみましょう。デフォルトで~/php/tv/1546-1-20090108-0115.m2tというファイルが出来ているはずです。ファイル名はそれぞれ以下のルールで命名されます。<br /> 
    302329  TID:しょぼいカレンダーと共通の番組IDです。<br /> 
    303330  話数:番組が第何話かを示します。該当しない場合は空白になります。<br /> 
    304331  放映日:YYYYmmddスタイルの放映日です。<br /> 
    305332  放映時刻:0000-2359の間での開始時刻になります。しょぼいカレンダーでは24:00以降の時刻を扱いますがfoltiaでは暦通り24:00以降の時刻は次の日として取り扱います。<br /> 
    306    MPEG2の録画が完了するとfoltiaはffmpegを利用してH.264/AVCへの変換を開始します。所要時間はCeleron2.6GHz環境で実尺の1.2倍程度の時間です。この例の場合~/php/tv/690.localized/mp4/MAQ-690-16-20060131-0045.MP4という動画ファイルと同じ階層にMAQ-690-16-20060131-0045.THMファイルができ上がります。ファイル名は、先頭がM4Vの場合MPEG4(XviD)、MAQの場合H.264/AVC、そのあとに続くのはMPEG2と同じルールです。</p> 
     333  拡張子:デジタルハイビジョンの場合.m2t、アナログ録画の場合m2pになります。<br /> 
     334   MPEG2の録画が完了するとfoltiaはffmpegを利用してH.264/AVCへの変換を開始します。この例の場合~/php/tv/1546.localized/mp4/MAQ-1546-1-20090108-0115.MP4という動画ファイルと同じ階層にMAQ-690-16-20060131-0045.THMファイルができ上がります。ファイル名は、先頭がM4Vの場合MPEG4(XviD)、MAQの場合H.264/AVC、そのあとに続くのはMPEG2と同じルールです。</p> 
    307335<p> 番組指定による自動録画が動いたら、つぎにEPGによる個別番組録画の動作確認に移りましょう。<br /> 
    308336   まず番組データをXMLTVを用いてインポートします。</p> 
     
    349377<p>&nbsp;</p> 
    350378<h3>予約一覧:</h3> 
    351 <p> 大きく上下のふたつのエリアに分かれていて、予約されている番組の放映予定と番組名を一覧表示します。ここでも[TID]をクリックすると番組予約画面へ、[タイトル]をクリックすると「しょぼいカレンダー」の該当番組詳細画面へそれぞれ移動します。録画予約の解除は下半分のタイトルリストの項目から行います。EPG予約の解除もここから行います。「画質」項目は録画ビットレートをMbps単位で表示しています。<br /> 
     379<p> 大きく上下のふたつのエリアに分かれていて、予約されている番組の放映予定と番組名を一覧表示します。ここでも[TID]をクリックすると番組予約画面へ、[タイトル]をクリックすると「しょぼいカレンダー」の該当番組詳細画面へそれぞれ移動します。録画予約の解除は下半分のタイトルリストの項目から行います。EPG予約の解除もここから行います。「画質」項目は録画ビットレートをMbps単位で表示しています。(いまのところデジタル録画の重複表示には対応していません)<br /> 
    352380 色が付いている番組は重複警告です。搭載された録画ユニットで録画し切れない場合に色がつきます。赤色はカードに搭載されたアナログチューナーの重複、青色は外部入力の重複を示します。重複警告がでている番組は録画が欠ける可能性があります。また、アナログチューナー、外部チューナーともに00:00-00:30 番組A ,00:30-01:00 番組Bという番組が連続している場合は重複とは判断しません。<br /> 
    353381 引数rでエンコーダ数を変更して予約状況を調べる事が出来ます。listreserve.php?r=6で6台エンコーダを搭載したときの予約状況を調べる事が出来ます。<br /> 
     
    401429    <img src="img/screen15.png" width="800" height="600" /><br />  
    402430 「キャプ」でキャプチャ画面一覧を開きます。<br /> 
    403     <img src="img/screen17.png" width="800" height="600" /><br />  
     431    <img src="img/screen17.png" width="800" height="600" /><br /> 
     432    <br /> 
     433    この一連の画面をiPhoneで開くとこのようになります。<br /> 
     434    <img src="img/iPhone_20080928-23.jpg" width="213" height="320" /><img src="img/iPhone_20080928-30.jpg" width="213" height="320" /><img src="img/iPhone_20080928-27.jpg" width="213" height="320" /><img src="img/iPhone_20080928-25.jpg" width="213" height="320" /><br />  
    404435</p> 
    405436<h3>Folcast(RSS):</h3> 
     
    468499<p>今後ユーザごとにFolcastを編集出来る機能などを開発予定です。</p> 
    469500<h2 id="colophon">・おわりに</h2> 
    470 <p> 以上、駆け足でfoltiaの概要を説明してきました。今のところfoltiaには視聴に関する機能は一切ありませんが、使用例として自宅では富士通T90Hというパソコンにfoltia録画ボリュームをSambaでマウントし、WinDVDでMPEG2を再生、外ではiPod 
    471   VideoでMPEG4を視聴しています。DVD Playerソフトでファイルを選んで再生するのがいまひとつめんどくさい操作なので、今後の改良点としたいところです。<br /> 
     501<p> 以上、駆け足でfoltiaの概要を説明してきました。今のところfoltiaには視聴に関する機能は一切ありませんが、パソコンにfoltia録画ボリュームをSambaでマウントし、VLCでMPEG2を再生、外ではiPhoneでfolcastかストリーミングで視聴しています。DVD 
     502  Playerソフトでファイルを選んで再生するのがいまひとつめんどくさい操作なので、今後の改良点としたいところです。<br /> 
    472503   foltiaはまだまだ開発途上のソフトウェアです。今後の計画は以下の様なものを考えています。<br /> 
    473504   ・未読番組管理機能<br /> 
    474505   ・ロケーションフリーテレビのようなライブストリーミング機能<br /> 
    475    ・デジタル放送のデジタル録画機能<br /> 
    476  詳しくはfoltia Development Central wiki:「<a href = "http://www.dcc-jpl.com/foltia/wiki/futuretodo">foltia のToDoやらゆめを適当に書くwik</a>i」に。 <br /> 
    477   今後も全ての情報はDCC-JPL Japanの公式ページ&lt;<a href="http://www.dcc-jpl.com/soft/foltia/">http://www.dcc-jpl.com/soft/foltia/</a>&gt;に掲載していきます。</p> 
     506 詳しくはfoltia Development Central wiki:「<a href = "http://www.dcc-jpl.com/foltia/wiki/futuretodo">foltia 
     507 のToDoやらゆめを適当に書くwik</a>i」に書かれる予定です。 <br /> 
     508今後も全ての情報はDCC-JPL Japanの公式ページ&lt;<a href="http://www.dcc-jpl.com/soft/foltia/">http://www.dcc-jpl.com/soft/foltia/</a>&gt;に掲載していきます。</p> 
    478509<p>・謝辞<br /> 
    479510  以下の数々のサイトを利用、参考にさせていただいております。改めましてお礼申し上げます。<br /> 
  • trunk/install/mktable.txt

    r70 r83  
     1 
    12drop table  foltia_program ; 
    23 
     
    3334m2pfilename text , 
    3435PSPfilename text , 
    35 epgaddedby int8 
     36epgaddedby int8 ,  
     37lastupdate timestamp, 
     38filestatus int4 
    3639); 
    3740create unique index foltia_subtitle_pid_index on foltia_subtitle (pid); 
     
    4649drop table foltia_tvrecord; 
    4750create table foltia_tvrecord ( 
    48 tid int8  PRIMARY KEY
     51tid int8 
    4952stationid int8, 
    50 bitrate int8 
     53bitrate int8 , 
     54digital int8 
    5155); 
    5256create  index foltia_tvrecord_tid_index on foltia_tvrecord (tid); 
     
    99103    tunerch text, 
    100104    device text, 
    101     ontvcode text 
     105    ontvcode text, 
     106        digitalch bigint, 
     107        digitalstationband bigint 
    102108); 
    103109REVOKE ALL on "foltia_station" from PUBLIC; 
     
    133139-- 
    134140INSERT INTO foltia_program VALUES (0, 'EPG録画', '', '', NULL, '', '', 3, 1, '', ''); 
    135 INSERT INTO foltia_tvrecord VALUES (0,0,5); 
    136  
    137 INSERT INTO foltia_station VALUES (1, 'NHK総合', 1, 'NHK', '', NULL, NULL, NULL, '0031.ontvjapan.com'); 
    138 INSERT INTO foltia_station VALUES (3, 'NHK教育', 3, 'ETV', '', NULL, NULL, NULL, '0041.ontvjapan.com'); 
    139 INSERT INTO foltia_station VALUES (4, '日本テレビ', 4, 'NTV', '', NULL, NULL, NULL, '0004.ontvjapan.com'); 
    140 INSERT INTO foltia_station VALUES (6, 'TBS', 6, 'TBS', '', NULL, NULL, NULL, '0005.ontvjapan.com'); 
    141 INSERT INTO foltia_station VALUES (8, 'フジテレビ', 8, 'CX', '', NULL, NULL, NULL, '0006.ontvjapan.com'); 
    142 INSERT INTO foltia_station VALUES (10, 'テレビ朝日', 10, 'EX', '', NULL, NULL, NULL, '0007.ontvjapan.com'); 
    143 INSERT INTO foltia_station VALUES (12, 'テレビ東京', 12, 'TX', '', NULL, NULL, NULL, '0008.ontvjapan.com'); 
    144 INSERT INTO foltia_station VALUES (422, '東海テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    145 INSERT INTO foltia_station VALUES (42, 'tvk', 5, 'TVK', '', NULL, NULL, NULL, '0009.ontvjapan.com'); 
    146 INSERT INTO foltia_station VALUES (423, 'ShowTime', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    147 INSERT INTO foltia_station VALUES (424, 'メ〜テレ', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    148 INSERT INTO foltia_station VALUES (409, 'BS日テレ', 0, '', '', 'b', 'X141', NULL, '3004.ontvjapan.com'); 
    149 INSERT INTO foltia_station VALUES (384, 'BS朝日', 0, '', '', 'b', 'X151', NULL, '3005.ontvjapan.com'); 
    150 INSERT INTO foltia_station VALUES (425, '三重テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    151 INSERT INTO foltia_station VALUES (426, '中京テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    152 INSERT INTO foltia_station VALUES (293, 'AT-X', 0, '', '', NULL, NULL, NULL, NULL); 
    153 INSERT INTO foltia_station VALUES (161, 'BS-i', 0, '', '', 'b', 'X161', NULL, '3006.ontvjapan.com'); 
    154 INSERT INTO foltia_station VALUES (382, 'BSジャパン', 0, '', '', 'b', 'X171', NULL, '3007.ontvjapan.com'); 
    155 INSERT INTO foltia_station VALUES (295, 'フジ721', -10, '', '', NULL, NULL, NULL, NULL); 
    156 INSERT INTO foltia_station VALUES (380, 'スカパー180ch', -10, '', '', NULL, NULL, NULL, NULL); 
    157 INSERT INTO foltia_station VALUES (427, '岐阜放送', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    158 INSERT INTO foltia_station VALUES (428, 'テレビ新広島', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    159 INSERT INTO foltia_station VALUES (383, 'サンテレビ', -10, '', '', NULL, NULL, NULL, NULL); 
    160 INSERT INTO foltia_station VALUES (429, 'CBCテレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL); 
    161 INSERT INTO foltia_station VALUES (385, 'TBSチャンネル', 0, '', '', NULL, NULL, NULL, NULL); 
    162 INSERT INTO foltia_station VALUES (386, 'テレ朝チャンネル', 0, '', '', NULL, NULL, NULL, NULL); 
    163 INSERT INTO foltia_station VALUES (389, 'BS Japan', 0, '', '', 'b', 'X171', NULL, NULL); 
    164 INSERT INTO foltia_station VALUES (390, 'サンテレビジョン', -10, '', '', NULL, NULL, NULL, NULL); 
    165 INSERT INTO foltia_station VALUES (0, '[全局]', 0, NULL, NULL, NULL, NULL, NULL, NULL); 
    166 INSERT INTO foltia_station VALUES (392, 'スカパー183ch', 0, '', '', NULL, NULL, NULL, NULL); 
    167 INSERT INTO foltia_station VALUES (393, 'BSQR 489', -10, '', '', 'b', 'X489', NULL, NULL); 
    168 INSERT INTO foltia_station VALUES (394, 'スカパー160ch', -10, '', '', NULL, NULL, NULL, NULL); 
    169 INSERT INTO foltia_station VALUES (396, 'KBS京都', -10, '', '', NULL, NULL, NULL, NULL); 
    170 INSERT INTO foltia_station VALUES (398, 'テレビ大阪', -10, '', '', NULL, NULL, NULL, NULL); 
    171 INSERT INTO foltia_station VALUES (399, 'ABCテレビ', -10, '', '', NULL, NULL, NULL, NULL); 
    172 INSERT INTO foltia_station VALUES (400, 'なし', -10, '', '', NULL, NULL, NULL, NULL); 
    173 INSERT INTO foltia_station VALUES (402, '関西テレビ', -10, '', '', NULL, NULL, NULL, NULL); 
    174 INSERT INTO foltia_station VALUES (406, 'MBS毎日放送', -10, '', '', NULL, NULL, NULL, NULL); 
    175 INSERT INTO foltia_station VALUES (407, 'animate.tv', -10, '', '', NULL, NULL, NULL, NULL); 
    176 INSERT INTO foltia_station VALUES (410, 'テレビ愛知', -10, '', '', NULL, NULL, NULL, NULL); 
    177 INSERT INTO foltia_station VALUES (411, 'インターネット', -10, '', '', NULL, NULL, NULL, NULL); 
    178 INSERT INTO foltia_station VALUES (381, 'BSフジ', 0, '', '', 'b', 'X181', NULL, '3008.ontvjapan.com'); 
    179 INSERT INTO foltia_station VALUES (413, 'ytv', -10, '', '', NULL, NULL, NULL, NULL); 
    180 INSERT INTO foltia_station VALUES (414, 'LFX488', -10, '', '', NULL, NULL, NULL, NULL); 
    181 INSERT INTO foltia_station VALUES (415, 'LFX', -10, '', '', NULL, NULL, NULL, NULL); 
    182 INSERT INTO foltia_station VALUES (416, 'LFX BB', -10, '', '', NULL, NULL, NULL, NULL); 
    183 INSERT INTO foltia_station VALUES (191, 'WOWOW', 0, 'BS5', '', 'b', 'X191', NULL, '3009.ontvjapan.com'); 
    184 INSERT INTO foltia_station VALUES (419, 'GyaO', -10, '', '', NULL, NULL, NULL, NULL); 
    185 INSERT INTO foltia_station VALUES (418, '放送大学', 0, 'UAIR', '', NULL, NULL, NULL, '0013.ontvjapan.com'); 
    186 INSERT INTO foltia_station VALUES (420, 'WOWOW2', 0, NULL, NULL, 'b', 'X192', NULL, '3010.ontvjapan.com'); 
    187 INSERT INTO foltia_station VALUES (417, 'とちぎテレビ', -10, 'TTV', '', NULL, NULL, NULL, NULL); 
    188 INSERT INTO foltia_station VALUES (412, '群馬テレビ', -10, 'GTV', '', NULL, NULL, NULL, NULL); 
    189 INSERT INTO foltia_station VALUES (46, 'チバテレビ', -10, 'CTC', '', NULL, NULL, NULL, NULL); 
    190 INSERT INTO foltia_station VALUES (38, 'テレ玉', -10, 'TVS', '', NULL, NULL, NULL, NULL); 
    191 INSERT INTO foltia_station VALUES (14, 'TOKYO MX', 0, 'MX', '', NULL, NULL, NULL, NULL); 
    192 INSERT INTO foltia_station VALUES (421, 'WOWOW3', 0, NULL, NULL, 'b', 'X193', NULL, '3011.ontvjapan.com'); 
    193 INSERT INTO foltia_station VALUES (401, 'チャンネルNECO', 0, '', '', 'c', 'X242', NULL, '1008.ontvjapan.com'); 
    194 INSERT INTO foltia_station VALUES (395, 'カミングスーンTV', 0, '', '', 'c', 'X245', NULL, '1012.ontvjapan.com'); 
    195 INSERT INTO foltia_station VALUES (408, 'ファミリー劇場', 0, '', '', 'c', 'X254', NULL, '1015.ontvjapan.com'); 
    196 INSERT INTO foltia_station VALUES (397, 'カートゥーンネットワーク', 0, '', '', 'c', 'X262', NULL, '1046.ontvjapan.com'); 
    197 INSERT INTO foltia_station VALUES (103, 'NHK-BShi', 0, '', '', 'b', 'X103', '', '3003.ontvjapan.com'); 
    198 INSERT INTO foltia_station VALUES (101, 'NHK-BS1', 0, 'BS7', '', 'b', 'X101',NULL,  '3001.ontvjapan.com'); 
    199 INSERT INTO foltia_station VALUES (102, 'NHK-BS2', 0, 'BS11', '',  'b', 'X102',NULL,  '3002.ontvjapan.com'); 
    200 INSERT INTO foltia_station VALUES (261, 'キッズステーション', 0, '', '', 'c', 'X264', '', '1045.ontvjapan.com'); 
    201 INSERT INTO foltia_station VALUES (263, 'アニマックス', 0, '', '', 'c', 'X263', '', '1047.ontvjapan.com'); 
     141INSERT INTO foltia_tvrecord VALUES (0,0,5,1); 
     142 
     143 
     144 
     145INSERT INTO foltia_station VALUES (0, '[全局]', 0, '', '', '', '', '', '',NULL,NULL); 
     146INSERT INTO foltia_station VALUES (1, 'NHK総合', 1, 'NHK', '', NULL, NULL, NULL, '0031.ontvjapan.com',27,0); 
     147INSERT INTO foltia_station VALUES (3, 'NHK教育', 3, 'ETV', '', NULL, NULL, NULL, '0041.ontvjapan.com',26,0); 
     148INSERT INTO foltia_station VALUES (4, '日本テレビ', 4, 'NTV', '', NULL, NULL, NULL, '0004.ontvjapan.com',25,0); 
     149INSERT INTO foltia_station VALUES (6, 'TBS', 6, 'TBS', '', NULL, NULL, NULL, '0005.ontvjapan.com',22,0); 
     150INSERT INTO foltia_station VALUES (8, 'フジテレビ', 8, 'CX', '', NULL, NULL, NULL, '0006.ontvjapan.com',21,0); 
     151INSERT INTO foltia_station VALUES (10, 'テレビ朝日', 10, 'EX', '', NULL, NULL, NULL, '0007.ontvjapan.com',24,0); 
     152INSERT INTO foltia_station VALUES (12, 'テレビ東京', 12, 'TX', '', NULL, NULL, NULL, '0008.ontvjapan.com',23,0); 
     153INSERT INTO foltia_station VALUES (42, 'tvk', 42, 'TVK', '', '', '', '', '0009.ontvjapan.com',18,0); 
     154INSERT INTO foltia_station VALUES (14, 'TOKYO MX', 14, 'MX', '', '', '', '', '0016.ontvjapan.com',20,0); 
     155INSERT INTO foltia_station VALUES (46, 'チバテレビ', -10, 'CTC', '', NULL, NULL, NULL, NULL,30,0); 
     156INSERT INTO foltia_station VALUES (38, 'テレ玉', -10, 'TVS', '', NULL, NULL, NULL, NULL,32,0); 
     157INSERT INTO foltia_station VALUES (418, '放送大学', -10, 'UAIR', '', NULL, NULL, NULL, '0013.ontvjapan.com',28,0); 
     158INSERT INTO foltia_station VALUES (101, 'NHK-BS1', 0, 'BS7', '', '', '101', '', '3001.ontvjapan.com',101,1); 
     159INSERT INTO foltia_station VALUES (102, 'NHK-BS2', 0, 'BS11', '', '', '102', '', '3002.ontvjapan.com',102,1); 
     160INSERT INTO foltia_station VALUES (103, 'NHK-BShi', 0, '', '', '', '103', '', '3003.ontvjapan.com',103,1); 
     161INSERT INTO foltia_station VALUES (409, 'BS日テレ', 0, '', '', '', '141', '', '3004.ontvjapan.com',141,1); 
     162INSERT INTO foltia_station VALUES (384, 'BS朝日', 0, '', '', '', '151', '', '3005.ontvjapan.com',151,1); 
     163INSERT INTO foltia_station VALUES (161, 'BS-i', 0, '', '', '', '161', '', '3006.ontvjapan.com',161,1); 
     164INSERT INTO foltia_station VALUES (389, 'BS Japan', 0, '', '', '', '171', '','3007.ontvjapan.com',171,1); 
     165INSERT INTO foltia_station VALUES (381, 'BSフジ', 0, '', '', '', '181', '', '3008.ontvjapan.com',181,1); 
     166INSERT INTO foltia_station VALUES (191, 'WOWOW', 0, 'BS5', '', '', '191', '', '3009.ontvjapan.com',191,1); 
     167INSERT INTO foltia_station VALUES (420, 'WOWOW2', 0, '', '', '', '192', '', '3010.ontvjapan.com',192,1); 
     168INSERT INTO foltia_station VALUES (421, 'WOWOW3', 0, '', '', '', '193', '', '3011.ontvjapan.com',193,1); 
     169INSERT INTO foltia_station VALUES (468, 'BS11デジタル', 0, '', '', '', '211', '', '',211,1); 
     170INSERT INTO foltia_station VALUES (408, 'ファミリー劇場', 0, '', '', '', '751', '', '1015.ontvjapan.com',NULL,NULL); 
     171INSERT INTO foltia_station VALUES (397, 'カートゥーンネットワーク', 0, '', '', '', '780', '', '1046.ontvjapan.com',NULL,NULL); 
     172INSERT INTO foltia_station VALUES (263, 'アニマックス', 0, '', '', '', '782', '', '1047.ontvjapan.com',NULL,NULL); 
     173INSERT INTO foltia_station VALUES (261, 'キッズステーション', 0, '', '', 'c', '781', '', '1045.ontvjapan.com',NULL,NULL); 
     174INSERT INTO foltia_station VALUES (449, 'ディスカバリーチャンネル', 0, '', '', '', '796', '', '1062.ontvjapan.com',NULL,NULL); 
     175INSERT INTO foltia_station VALUES (448, 'MONDO21', 0, '', '', '', '722', '', '1049.ontvjapan.com',NULL,NULL); 
     176INSERT INTO foltia_station VALUES (401, 'チャンネルNECO', 0, '', '', '', '750', '', '1008.ontvjapan.com',NULL,NULL); 
     177INSERT INTO foltia_station VALUES (455, '330ch WOWOW', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     178INSERT INTO foltia_station VALUES (480, 'TBSラジオ(954)', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     179INSERT INTO foltia_station VALUES (477, '北海道文化放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     180INSERT INTO foltia_station VALUES (463, 'gooアニメ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     181INSERT INTO foltia_station VALUES (461, '@nifty', -10, '', '', '', '', '', '',NULL,NULL); 
     182INSERT INTO foltia_station VALUES (466, 'NHKラジオ第一', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     183INSERT INTO foltia_station VALUES (474, '日テレプラス', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     184INSERT INTO foltia_station VALUES (476, 'ニコニコアニメチャンネル', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     185INSERT INTO foltia_station VALUES (451, 'RKB毎日放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     186INSERT INTO foltia_station VALUES (452, '北海道放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     187INSERT INTO foltia_station VALUES (454, 'テレビ和歌山', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     188INSERT INTO foltia_station VALUES (456, '静岡放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     189INSERT INTO foltia_station VALUES (457, 'i-revo', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     190INSERT INTO foltia_station VALUES (459, '東北放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     191INSERT INTO foltia_station VALUES (464, 'テレビ山口', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     192INSERT INTO foltia_station VALUES (478, '札幌テレビ放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     193INSERT INTO foltia_station VALUES (395, 'カミングスーンTV', -10, '', '', '', '', '', '',NULL,NULL); 
     194INSERT INTO foltia_station VALUES (443, 'スーパーチャンネル', -10, '', '', '', '', '', '',NULL,NULL); 
     195INSERT INTO foltia_station VALUES (385, 'TBSチャンネル', 0, '', '', '', '765', '', '',NULL,NULL); 
     196INSERT INTO foltia_station VALUES (462, '瀬戸内海放送', -10, '', '', '', '', '', '',NULL,NULL); 
     197INSERT INTO foltia_station VALUES (473, 'フジCSHD', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     198INSERT INTO foltia_station VALUES (475, 'スカパー181ch', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     199INSERT INTO foltia_station VALUES (479, '北海道テレビ放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     200INSERT INTO foltia_station VALUES (450, 'NHK教育3', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     201INSERT INTO foltia_station VALUES (453, 'バンダイチャンネルキッズ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     202INSERT INTO foltia_station VALUES (458, '日テレプラス&サイエンス', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     203INSERT INTO foltia_station VALUES (460, 'ビクトリーチャンネル', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     204INSERT INTO foltia_station VALUES (472, 'ytv', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     205INSERT INTO foltia_station VALUES (422, '東海テレビ', -10, '', '', '', '', '', '',NULL,NULL); 
     206INSERT INTO foltia_station VALUES (423, 'ShowTime', -10, '', '', '', '', '', '',NULL,NULL); 
     207INSERT INTO foltia_station VALUES (424, 'メ〜テレ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     208INSERT INTO foltia_station VALUES (425, '三重テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     209INSERT INTO foltia_station VALUES (426, '中京テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     210INSERT INTO foltia_station VALUES (293, 'AT-X', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     211INSERT INTO foltia_station VALUES (295, 'フジ721', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     212INSERT INTO foltia_station VALUES (380, 'スカパー180ch', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     213INSERT INTO foltia_station VALUES (427, '岐阜放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     214INSERT INTO foltia_station VALUES (428, 'テレビ新広島', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     215INSERT INTO foltia_station VALUES (383, 'サンテレビ', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     216INSERT INTO foltia_station VALUES (429, 'CBCテレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     217INSERT INTO foltia_station VALUES (386, 'テレ朝チャンネル', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     218INSERT INTO foltia_station VALUES (390, 'サンテレビジョン', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     219INSERT INTO foltia_station VALUES (392, 'スカパー183ch', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     220INSERT INTO foltia_station VALUES (394, 'スカパー160ch', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     221INSERT INTO foltia_station VALUES (396, 'KBS京都', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     222INSERT INTO foltia_station VALUES (398, 'テレビ大阪', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     223INSERT INTO foltia_station VALUES (399, 'ABCテレビ', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     224INSERT INTO foltia_station VALUES (400, 'なし', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     225INSERT INTO foltia_station VALUES (402, '関西テレビ', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     226INSERT INTO foltia_station VALUES (406, 'MBS毎日放送', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     227INSERT INTO foltia_station VALUES (407, 'animate.tv', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     228INSERT INTO foltia_station VALUES (410, 'テレビ愛知', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     229INSERT INTO foltia_station VALUES (411, 'インターネット', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     230INSERT INTO foltia_station VALUES (413, 'よみうりテレビ', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     231INSERT INTO foltia_station VALUES (414, 'LFX488', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     232INSERT INTO foltia_station VALUES (415, 'LFX', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     233INSERT INTO foltia_station VALUES (416, 'LFX BB', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     234INSERT INTO foltia_station VALUES (419, 'GyaO', -10, '', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     235INSERT INTO foltia_station VALUES (417, 'とちぎテレビ', -10, 'TTV', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     236INSERT INTO foltia_station VALUES (412, '群馬テレビ', -10, 'GTV', '', NULL, NULL, NULL, NULL,NULL,NULL); 
     237INSERT INTO foltia_station VALUES (430, '奈良テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     238INSERT INTO foltia_station VALUES (431, 'TVQ九州放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     239INSERT INTO foltia_station VALUES (432, 'テレビ北海道', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     240INSERT INTO foltia_station VALUES (433, 'BIGLOBEストリーム', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     241INSERT INTO foltia_station VALUES (434, 'テレビせとうち', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     242INSERT INTO foltia_station VALUES (435, '中国放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     243INSERT INTO foltia_station VALUES (436, '文化放送(1134)', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     244INSERT INTO foltia_station VALUES (437, '広島ホームテレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     245INSERT INTO foltia_station VALUES (438, '広島テレビ', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     246INSERT INTO foltia_station VALUES (439, '岡山放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     247INSERT INTO foltia_station VALUES (440, '山陽放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     248INSERT INTO foltia_station VALUES (441, 'びわ湖放送', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     249INSERT INTO foltia_station VALUES (442, 'NHK-FM', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     250INSERT INTO foltia_station VALUES (444, 'バンダイチャンネル', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     251INSERT INTO foltia_station VALUES (445, 'フレッツ・スクウェア(NTT東日本)', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     252INSERT INTO foltia_station VALUES (446, 'フジ739', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
     253INSERT INTO foltia_station VALUES (447, 'Yahoo!動画', -10, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL); 
    202254 
    203255 
  • trunk/install/perl/addpidatq.pl

    r1 r83  
    4747 if ($titlecount[0]  == 1 ){ 
    4848 
    49 $DBQuery =  "SELECT bitrate FROM  foltia_tvrecord , foltia_subtitle  WHERE foltia_tvrecord.tid = foltia_subtitle.tid AND pid='$pid' "; 
     49$DBQuery =  "SELECT bitrate,digital FROM  foltia_tvrecord , foltia_subtitle  WHERE foltia_tvrecord.tid = foltia_subtitle.tid AND pid='$pid' "; 
    5050 $sth = $dbh->prepare($DBQuery); 
    5151$sth->execute(); 
    5252 @titlecount= $sth->fetchrow_array; 
    5353$bitrate = $titlecount[0];#ビットレート取得 
     54if ($titlecount[1] >= 1){ 
     55        $usedigital = $titlecount[1];#デジタル優先フラグ 
     56}else{ 
     57        $usedigital = 0; 
     58} 
    5459 
    5560#PID抽出 
    5661$now = &epoch2foldate(`date +%s`); 
    5762 
    58 $DBQuery =  "SELECT stationrecch FROM foltia_station,foltia_subtitle WHERE foltia_subtitle.pid = '$pid'  AND  foltia_subtitle.stationid =  foltia_station.stationid "; 
     63#stationIDからrecch 
     64$DBQuery =  "SELECT stationrecch,digitalch ,digitalstationband ,foltia_station.stationid  FROM foltia_station,foltia_subtitle WHERE foltia_subtitle.pid = '$pid'  AND  foltia_subtitle.stationid =  foltia_station.stationid "; 
    5965 
    60  
    61 #stationIDからrecch 
    6266 $stationh = $dbh->prepare($DBQuery); 
    6367        $stationh->execute(); 
    6468@stationl =  $stationh->fetchrow_array; 
    6569$recch = $stationl[0]; 
    66  
     70if ($recch eq ""){ 
     71        &writelog("addpidatq ERROR recch is NULL:$DBQuery."); 
     72        exit 1; 
     73
     74if ($stationl[1] => 1){ 
     75        $digitalch = $stationl[1]; 
     76}else{ 
     77        $digitalch = 0; 
     78
     79if ($stationl[2] => 1){ 
     80        $digitalstationband = $stationl[2]; 
     81}else{ 
     82        $digitalstationband = 0; 
     83
    6784$DBQuery =  "SELECT  * FROM  foltia_subtitle WHERE pid='$pid' "; 
    6885 $sth = $dbh->prepare($DBQuery); 
     
    109126} 
    110127 
    111 Schedule::At::add (TIME => "$atdateparam", COMMAND => "$toolpath/perl/recwrap.pl $recch $reclength $bitrate $tid $countno $pid" , TAG => "$pid"."_R"); 
    112         &writelog("addpidatq TIME $atdateparam   COMMAND $toolpath/perl/recwrap.pl $recch $reclength $bitrate $tid $countno $pid"); 
     128Schedule::At::add (TIME => "$atdateparam", COMMAND => "$toolpath/perl/recwrap.pl $recch $reclength $bitrate $tid $countno $pid $stationid $usedigital $digitalstationband $digitalch" , TAG => "$pid"."_R"); 
     129        &writelog("addpidatq TIME $atdateparam   COMMAND $toolpath/perl/recwrap.pl $recch $reclength $bitrate $tid $countno $pid $stationid $usedigital $digitalstationband $digitalch"); 
    113130 
    114131}#end #もし新開始時刻が15分移譲先なら再キュー 
    115132 
    116133}else{ 
    117 &writelog("addpidatq drop:expire $pid  $startafter  $now $startdatetime"); 
     134&writelog("addpidatq drop:expire $pid $startafter $now $startdatetime"); 
    118135}#放送が未来の日付なら 
    119136 
  • trunk/install/perl/captureimagemaker.pl

    r1 r83  
    100100# $captureimgdir = "$tid"."-"."$countno"."-"."$date"."-"."$time"; 
    101101$captureimgdir = $filename; 
    102 $captureimgdir =~ s/\.m2p$//;  
     102$captureimgdir =~ s/\.m2p$|\.m2t$//;  
    103103 
    104104unless (-e "$capimgdirname/$captureimgdir"){ 
     
    118118 
    119119# 10秒ごとに 
    120 system ("mplayer -ss 00:00:10 -vo jpeg:outdir=$capimgdirname/$captureimgdir/ -vf crop=690:460:12:10,scale=160:120 -ao null -sstep 9 -v 3 $recfolderpath/$filename"); 
     120if ($filename =~ /m2t$/){ 
     121        &writelog("captureimagemaker DEBUG mplayer -ss 00:00:10 -vo jpeg:outdir=$capimgdirname/$captureimgdir/ -vf scale=192:108 -ao null -sstep 9 -v 3 $recfolderpath/$filename"); 
     122        system ("mplayer -ss 00:00:10 -vo jpeg:outdir=$capimgdirname/$captureimgdir/ -vf scale=192:108 -ao null -sstep 9 -v 3 $recfolderpath/$filename"); 
     123}else{ 
     124        &writelog("captureimagemaker DEBUG mplayer -ss 00:00:10 -vo jpeg:outdir=$capimgdirname/$captureimgdir/ -vf crop=690:460:12:10,scale=160:120 -ao null -sstep 9 -v 3 $recfolderpath/$filename"); 
     125        system ("mplayer -ss 00:00:10 -vo jpeg:outdir=$capimgdirname/$captureimgdir/ -vf crop=690:460:12:10,scale=160:120 -ao null -sstep 9 -v 3 $recfolderpath/$filename"); 
     126
    121127 
  • trunk/install/perl/deletemovie.pl

    r1 r83  
    3232 
    3333#ファイル名正当性チェック 
    34 if ($fname =~ /.m2p\z/){ 
     34if ($fname =~ /.m2p$|.m2t$/){ 
    3535 
    3636}else{ 
  • trunk/install/perl/foltia_conf1.pl.template

    r70 r83  
    1515$uhfbandtype = 1; # CATVなら1 UHF帯なら0 : 0=ntsc-bcast-jp 1=ntsc-cable-jp 
    1616$rapidfiledelete =  1;#1なら削除ファイルは「mita」ディレクトリに移動。0なら即時削除 
    17 $tunerinputnum = 6; #IO-DATA DV-MVP/RX,RX2,RX2W 
    18 $svideoinputnum = 7;#IO-DATA DV-MVP/RX,RX2,RX2W 
    19 $comvideoinputnum = 8;#IO-DATA DV-MVP/RX,RX2,RX2W 
     17$tunerinputnum = 0; #IO-DATA DV-MVP/RX,RX2,RX2W 
     18$svideoinputnum = 1;#IO-DATA DV-MVP/RX,RX2,RX2W 
     19$comvideoinputnum= 2;#IO-DATA DV-MVP/RX,RX2,RX2W 
    2020$haveirdaunit = 1;#Tira-2<http://www.home-electro.com/tira2.php>をつないでいるときに1,なければ0 
    2121$mp4filenamestyle = 1 ;#0:PSP ファームウェアver.2.80より前と互換性を持つファイル名 1;よりわかりやすいファイル名 
    2222$trconqty = 2; 
    23 #0:PSP/iPod XviD MPEG4(旧式):faacとMPEG4IPを使って変換 
    24 #1:iPod Xvid MPEG4 標準画質 15fps 300kbps 
    25 #2:iPod H.264 中画質 24fps 300kbps 
    26 #3:iPod H.264 高画質 30fps 300kbps 
     23#0:PSP/iPod XviD MPEG4(旧式):faacとMPEG4IPを使って変換(古い設定) 
     24#1:iPod Xvid MPEG4 標準画質 15fps 300kbps / デジタル  360x202 24.00fps 300kbps 
     25#2:iPod H.264 中画質 24fps 300kbps / デジタル 480x272  29.97fps 400kbps 
     26#3:iPod H.264 高画質 30fps 300kbps / デジタル  640x352 29.97fps 600kbps 
    2727$phptoolpath = $toolpath ;#php版の初期設定の位置。デフォルトではperlと同じ位置 
    2828 
  • trunk/install/perl/foltialib.pl

    r70 r83  
    2222         $DBPass=""; 
    2323         
     24 
     25 
     26  $FILESTATUSRESERVINGLONG = 10; 
     27  $FILESTATUSRESERVINGSHORT = 20; 
     28  $FILESTATUSRECORDING = 30; 
     29  $FILESTATUSRECTSSPLITTING = 40; 
     30  $FILESTATUSRECEND = 50; 
     31  $FILESTATUSWAITINGCAPTURE = 55; 
     32  $FILESTATUSCAPTURE = 60; 
     33  $FILESTATUSCAPEND = 70; 
     34  $FILESTATUSTHMCREATE = 72; 
     35  $FILESTATUSWAITINGTRANSCODE = 80; 
     36  $FILESTATUSTRANSCODETSSPLITTING = 90; 
     37  $FILESTATUSTRANSCODEFFMPEG = 100; 
     38  $FILESTATUSTRANSCODEWAVE = 110; 
     39  $FILESTATUSTRANSCODEAAC = 120; 
     40  $FILESTATUSTRANSCODEMP4BOX = 130; 
     41  $FILESTATUSTRANSCODEATOM = 140; 
     42  $FILESTATUSTRANSCODECOMPLETE = 150; 
     43  $FILESTATUSALLCOMPLETE = 200; 
     44 
    2445 
    2546#------------------------------ 
     
    258279 
    259280 
     281sub getpidbympegfilename { 
     282#引き数:m2pfilename 
     283#戻り値:PID 
     284my $m2pfilename =  $_[0] ; 
     285if ($m2pfilename eq ""){ 
     286        return  0 ; 
     287} 
     288 
     289my $DBQuery =  "SELECT pid FROM foltia_subtitle WHERE m2pfilename = '$m2pfilename' LIMIT 1 "; 
     290my $sth; 
     291$sth = $dbh->prepare($DBQuery); 
     292$sth->execute(); 
     293#print "$DBQuery\n"; 
     294my @pidinfo = $sth->fetchrow_array; 
     295my $pid  = $pidinfo[0]; 
     296 
     297if ($pid eq ""){ 
     298        return  0 ; 
     299}else{ 
     300        return $pid; 
     301} 
     302}#end sub getpidbympegfilename 
     303 
     304sub changefilestatus { 
     305#引き数:PID,updatestatus 
     306#戻り値:エラーコード 
     307my $pid =  $_[0] ; 
     308my $updatestatus = $_[1]; 
     309if (($pid eq "" ) || ($updatestatus eq "")){ 
     310        return  0 ; 
     311} 
     312 
     313if ($updatestatus > 0 ){ 
     314my $DBQuery =  "UPDATE  foltia_subtitle SET filestatus = $updatestatus , lastupdate      = now() WHERE pid = $pid "; 
     315my $sth; 
     316$sth = $dbh->prepare($DBQuery); 
     317$sth->execute(); 
     318return 1; 
     319}else{ 
     320        &writelog("foltialib changefilestatus ERR Sttus invalid:$updatestatus"); 
     321        return  0 ; 
     322} 
     323}# end sub changefilestatus 
     324 
     325 
     326sub getfilestatus { 
     327#引き数:PID 
     328#戻り値:ステータス 
     329 
     330#10:予約中(5分以上先) 
     331#20:予約中(5分以内) 
     332#30:録画中 
     333#40:TSSplit中 
     334#50:MPEG2録画終了 
     335#55 静止画キャプチャ待 
     336#60:静止画キャプ中 
     337#70:静止画キャプ終了 
     338#72:サムネイル作成済み(.THM) 
     339#80:トラコン待 
     340#90:トラコン中:TSsplit 
     341#100:トラコン中:H264 
     342#110:トラコン中:WAVE 
     343#120:トラコン中:AAC 
     344#130:トラコン中:MP4Box 
     345#140:トラコン中:ATOM 
     346#150:トラコン完了 
     347#200:全完了 
     348my $pid =  $_[0] ; 
     349if ($pid eq "" ){ 
     350        return  0 ; 
     351} 
     352 
     353my $DBQuery =  "SELECT filestatus FROM foltia_subtitle  WHERE pid = $pid "; 
     354my $sth; 
     355$sth = $dbh->prepare($DBQuery); 
     356$sth->execute(); 
     357 
     358my @statusinfo = $sth->fetchrow_array; 
     359my $status  = $statusinfo[0]; 
     360 
     361if ($status eq ""){ 
     362        return  0 ; 
     363}else{ 
     364        return $status; 
     365} 
     366 
     367 
     368}# end sub getfilestatus 
     369 
     370 
     371sub makemp4dir{ 
     372#TIDが100以上の3桁の場合はそのまま 
     373my $pspfilnamehd = $_[0]; 
     374my $tid = $_[0]; 
     375my $pspdirname = "$tid.localized/"; 
     376$pspdirname = $recfolderpath."/".$pspdirname; 
     377 
     378#なければ作る 
     379unless (-e $pspdirname ){ 
     380        system("$toolpath/perl/mklocalizeddir.pl $tid"); 
     381        #&writelog("recwrap mkdir $pspdirname"); 
     382} 
     383$pspdirname = "$tid.localized/mp4/"; 
     384$pspdirname = $recfolderpath."/".$pspdirname; 
     385#なければ作る 
     386unless (-e $pspdirname ){ 
     387        mkdir $pspdirname ,0777; 
     388        #&writelog("recwrap mkdir $pspdirname"); 
     389} 
     390return ("$pspdirname"); 
     391}#endsub makemp4dir 
     392 
     393 
     394 
     395 
     396 
     397 
     398 
     399 
     400 
     401 
     402 
     403 
     404 
     405 
     406 
     407 
     408 
     409 
     410 
     411 
     412 
     413 
     414 
     415 
     416 
     417 
     418 
     419 
     420 
     421 
     422 
     423 
     424 
     425 
     426 
     427 
     428 
     429 
     430 
     431 
     432 
     433 
     434 
     435 
     436 
     437 
     438 
     439 
     440 
    2604411; 
    261442 
  • trunk/install/perl/ipodtranscode.pl

    r70 r83  
    11#!/usr/bin/perl 
    2 #usage ipodtranscode.pl /path/to/mpeg2.m2p mp4filenamestring /path/to/mpeg2/tid.localized/mp4/ PID [aspect] 
     2#usage ipodtranscode.pl  
    33# 
    44# Anime recording system foltia 
    55# http://www.dcc-jpl.com/soft/foltia/ 
    66# 
    7 # 
    87# iPod MPEG4/H.264トラコン 
    98# ffmpegを呼び出して変換 
    10 # ffmpegはiPodパッチあて版を想定している 
    11 # ffmpegの作り方は 
    12 # http://www.dcc-jpl.com/diary/ddata2006/02A.html#20060215-00 
    139# 
    1410# DCC-JPL Japan/foltia project 
     
    1814use DBD::Pg; 
    1915use Jcode; 
    20  
    2116 
    2217$path = $0; 
     
    2520push( @INC, "$path"); 
    2621} 
    27  
    2822require "foltialib.pl"; 
    29 #引き数がアルか? 
    30 $recch = $ARGV[0] ; 
    31 if ($recch eq "" ){ 
    32         #引き数なしで実行されたら、終了 
    33         print "usage ipodtranscode.pl /path/to/mpeg2.m2p mp4filenamestring /path/to/mpeg2/tid.localized/mp4/ PID [aspect]\n"; 
    34         exit; 
    35 
    36  
    37 $inputmpeg2 = $ARGV[0];  
    38 $mp4filenamestring = $ARGV[1]; 
    39 $mp4outdir = $ARGV[2]; 
    40 $pid = $ARGV[3]; 
    41 $aspect = $ARGV[4]; 
     23 
     24 
     25# 二重起動の確認! 
     26$processes =  &processfind("ipodtranscode.pl"); 
     27#$processes = $processes +  &processfind("ffmpeg"); 
     28 
     29if ($processes > 1 ){ 
     30&writelog("ipodtranscode processes exist. exit:"); 
     31exit; 
     32}else{ 
     33#&writelog("ipodtranscode.pl  Normal launch."); 
     34
    4235 
    4336#DB初期化 
     
    4639         $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;; 
    4740 
    48  
     41# タイトル取得 
     42#トラコンフラグがたっていてステータス50以上150未満のファイルを古い順にひとつ探す 
     43# 数数える 
     44#$DBQuery =  "SELECT count(*) FROM foltia_subtitle, foltia_program, foltia_m2pfiles  
     45#WHERE filestatus >= $FILESTATUSRECEND AND filestatus < $FILESTATUSTRANSCODECOMPLETE  AND foltia_program.tid = foltia_subtitle.TID AND foltia_program.PSP = 1  AND foltia_m2pfiles.m2pfilename = foltia_subtitle.m2pfilename  "; 
     46#$sth = $dbh->prepare($DBQuery); 
     47#$sth->execute(); 
     48#@titlecount= $sth->fetchrow_array; 
     49&writelog("ipodtranscode starting up."); 
     50 
     51$counttranscodefiles = &counttranscodefiles(); 
     52if ($counttranscodefiles == 0){ 
     53        &writelog("ipodtranscode No MPEG2 files to transcode."); 
     54        exit; 
     55
     56sleep 30; 
     57 
     58while ($counttranscodefiles >= 1){ 
     59 
     60$DBQuery =  "SELECT foltia_subtitle.pid,foltia_subtitle.tid,foltia_subtitle.m2pfilename,filestatus,foltia_program.aspect ,foltia_subtitle.countno  
     61FROM foltia_subtitle, foltia_program, foltia_m2pfiles  
     62WHERE filestatus >= $FILESTATUSRECEND AND filestatus < $FILESTATUSTRANSCODECOMPLETE  AND foltia_program.tid = foltia_subtitle.TID AND foltia_program.PSP = 1  AND foltia_m2pfiles.m2pfilename = foltia_subtitle.m2pfilename  
     63ORDER BY enddatetime ASC  
     64LIMIT 1  "; 
     65 
     66$sth = $dbh->prepare($DBQuery); 
     67$sth->execute(); 
     68@dbparam = $sth->fetchrow_array; 
     69#print "$dbparam[0],$dbparam[1],$dbparam[2],$dbparam[3],$dbparam[4],$dbparam[5]\n"; 
     70&writelog("ipodtranscode DEBUG $DBQuery"); 
     71&writelog("ipodtranscode DEBUG $dbparam[0],$dbparam[1],$dbparam[2],$dbparam[3],$dbparam[4],$dbparam[5]"); 
     72$pid = $dbparam[0]; 
     73$tid = $dbparam[1]; 
     74$inputmpeg2 = $recfolderpath."/".$dbparam[2]; # path付き 
     75$mpeg2filename = $dbparam[2]; # pathなし 
     76$filestatus = $dbparam[3]; 
     77$aspect = $dbparam[4];# 16,1 (超額縁),4,3 
     78$countno = $dbparam[5]; 
     79$mp4filenamestring = &mp4filenamestringbuild($pid); 
     80 
     81&writelog("ipodtranscode DEBUG mp4filenamestring $mp4filenamestring"); 
     82#展開ディレクトリ作成 
     83$pspdirname = &makemp4dir($tid); 
     84$mp4outdir = $pspdirname ; 
     85# 実際のトラコン 
    4986# タイトル取得 
    5087if ($pid ne ""){ 
     
    82119 
    83120} 
    84 # アスペクト比 
    85 if ($aspect == 16){ 
    86 $cropopt = " -croptop 70 -cropbottom 60 -cropleft  8 -cropright 14 -aspect 1.7777 "; 
    87 }else{ 
    88 $cropopt = " -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 "; 
    89 
     121 
     122if ($filestatus <= $FILESTATUSRECEND){ 
     123
     124 
     125if ($filestatus <= $FILESTATUSWAITINGCAPTURE){ 
     126#なにもしない 
     127
     128 
     129if ($filestatus <= $FILESTATUSCAPTURE){ 
     130#unlink 
     131# Starlight breaker向けキャプチャ画像作成 
     132if (-e "$toolpath/perl/captureimagemaker.pl"){ 
     133        &writelog("ipodtranscode Call captureimagemaker $mpeg2filename"); 
     134&changefilestatus($pid,$FILESTATUSCAPTURE); 
     135        system ("$toolpath/perl/captureimagemaker.pl $mpeg2filename"); 
     136&changefilestatus($pid,$FILESTATUSCAPEND); 
     137
     138
     139 
     140if ($filestatus <= $FILESTATUSCAPEND){ 
     141# サムネイル作る 
     142&makethumbnail(); 
     143&changefilestatus($pid,$FILESTATUSTHMCREATE); 
     144
     145 
     146if ($filestatus <= $FILESTATUSWAITINGTRANSCODE){ 
     147
     148 
     149$filenamebody = $inputmpeg2 ; 
     150$filenamebody =~ s/.m2t$|.ts$|.m2p$|.mpg$//gi; 
     151#デジタルかアナログか 
     152if ($inputmpeg2 =~ /m2t$|ts$/i){ 
     153        #print "MPEG2-TS\n"; 
     154 
     155 
     156if ($filestatus <= $FILESTATUSTRANSCODETSSPLITTING){ 
     157                unlink("${filenamebody}_tss.m2t"); 
     158                unlink("${filenamebody}_HD.m2t"); 
     159
     160if ($filestatus <= $FILESTATUSTRANSCODEFFMPEG){ 
     161 
     162        # H.264出力 
     163        $trcnmpegfile = $inputmpeg2 ; 
     164        # アスペクト比 
     165        if ($aspect == 1){#超額縁 
     166        $cropopt = " -croptop 150 -cropbottom 150 -cropleft 200 -cropright 200 "; 
     167        }elsif($aspect == 4){#SD  
     168        $cropopt = " -croptop 6 -cropbottom 6 -cropleft 8 -cropright 8 "; 
     169        }else{#16:9 
     170        $cropopt = " -croptop 6 -cropbottom 6 -cropleft 8 -cropright 8 "; 
     171        } 
     172        # クオリティごとに 
     173        if (($trconqty eq "")||($trconqty == 1)){ 
     174        $ffmpegencopt = " -s 360x202 -deinterlace -r 24.00 -vcodec libx264 -g 300 -b 330000 -level 13 -loop 1 -sc_threshold 60 -partp4x4 1 -rc_eq 'blurCplx^(1-qComp)' -refs 3 -maxrate 700000 -async 50 -f h264 $filenamebody.264"; 
     175        }elsif($trconqty == 2){ 
     176        $ffmpegencopt = " -s 480x272 -deinterlace -r 29.97 -vcodec libx264 -g 300 -b 400000 -level 13 -loop 1 -sc_threshold 60 -partp4x4 1 -rc_eq 'blurCplx^(1-qComp)' -refs 3 -maxrate 700000 -async 50 -f h264 $filenamebody.264"; 
     177        }elsif($trconqty == 3){#640x352 
     178        $ffmpegencopt = " -s 640x352 -deinterlace -r 29.97 -vcodec libx264 -g 100 -b 600000 -level 13 -loop 1 -sc_threshold 60 -partp4x4 1 -rc_eq 'blurCplx^(1-qComp)' -refs 3 -maxrate 700000 -async 50 -f h264 $filenamebody.264"; 
     179        } 
     180        &changefilestatus($pid,$FILESTATUSTRANSCODEFFMPEG); 
     181        &writelog("ipodtranscode ffmpeg $filenamebody.264"); 
     182        system ("ffmpeg -y -i $trcnmpegfile $cropopt $ffmpegencopt"); 
     183         
     184        #もしエラーになったらTsSplitする 
     185        if (! -e "$filenamebody.264"){ 
     186                &changefilestatus($pid,$FILESTATUSTRANSCODETSSPLITTING); 
     187                unlink("${filenamebody}_tss.m2t"); 
     188                unlink("${filenamebody}_HD.m2t"); 
     189                if (-e "$toolpath/perl/tool/tss.py"){ 
     190                &writelog("ipodtranscode tss $inputmpeg2"); 
     191                system("$toolpath/perl/tool/tss.py $inputmpeg2"); 
     192                 
     193                }else{ 
     194                # TsSplit 
     195                &writelog("ipodtranscode TsSplitter $inputmpeg2"); 
     196                system("wine $toolpath/perl/tool/TsSplitter.exe  -EIT -ECM  -EMM -SD -1SEG -WAIT2 $inputmpeg2"); 
     197                } 
     198                if(-e "${filenamebody}_tss.m2t"){ 
     199                $trcnmpegfile = "${filenamebody}_tss.m2t"; 
     200                }elsif (-e "${filenamebody}_HD.m2t"){ 
     201                $trcnmpegfile = "${filenamebody}_HD.m2t"; 
     202                }else{ 
     203                &writelog("ipodtranscode ERR NOT Exist ${filenamebody}_HD.m2t"); 
     204                $trcnmpegfile = inputmpeg2 ; 
     205                } 
     206                #再ffmpeg 
     207                &changefilestatus($pid,$FILESTATUSTRANSCODEFFMPEG); 
     208                &writelog("ipodtranscode ffmpeg retry $filenamebody.264"); 
     209                system ("ffmpeg -y -i $trcnmpegfile $cropopt $ffmpegencopt"); 
     210        } 
     211        #もしエラーになったらcropやめる 
     212        if (! -e "$filenamebody.264"){ 
     213                #再ffmpeg 
     214                &changefilestatus($pid,$FILESTATUSTRANSCODEFFMPEG); 
     215                &writelog("ipodtranscode ffmpeg retry no crop $filenamebody.264"); 
     216                system ("ffmpeg -y -i $trcnmpegfile $ffmpegencopt"); 
     217        } 
     218
     219if ($filestatus <= $FILESTATUSTRANSCODEWAVE){ 
     220        # WAVE出力 
     221        unlink("${filenamebody}.wav"); 
     222        &changefilestatus($pid,$FILESTATUSTRANSCODEWAVE); 
     223        &writelog("ipodtranscode mplayer $filenamebody.wav"); 
     224        system ("mplayer $trcnmpegfile -vc null -vo null -ao pcm:file=$filenamebody.wav:fast"); 
     225 
     226
     227if ($filestatus <= $FILESTATUSTRANSCODEAAC){ 
     228        # AAC変換 
     229        unlink("${filenamebody}.aac"); 
     230        &changefilestatus($pid,$FILESTATUSTRANSCODEAAC); 
     231        if (-e "$toolpath/perl/tool/neroAacEnc"){ 
     232                if (-e "$filenamebody.wav"){ 
     233        &writelog("ipodtranscode neroAacEnc $filenamebody.wav"); 
     234        system ("$toolpath/perl/tool/neroAacEnc -br 128000  -if $filenamebody.wav  -of $filenamebody.aac"); 
     235                }else{ 
     236                &writelog("ipodtranscode ERR Not Found $filenamebody.wav"); 
     237                } 
     238        }else{ 
     239        #print "DEBUG $toolpath/perl/tool/neroAacEnc\n\n"; 
     240        &writelog("ipodtranscode faac $filenamebody.wav"); 
     241        system ("faac -b 128  -o $filenamebody.aac $filenamebody.wav "); 
     242        } 
     243 
     244
     245if ($filestatus <= $FILESTATUSTRANSCODEMP4BOX){ 
     246        # MP4ビルド 
     247        unlink("${filenamebody}.base.mp4"); 
     248        &changefilestatus($pid,$FILESTATUSTRANSCODEMP4BOX); 
     249        &writelog("ipodtranscode MP4Box $filenamebody"); 
     250                system ("cd $recfolderpath ; MP4Box -fps 29.97 -add $filenamebody.264 -new $filenamebody.base.mp4"); 
     251#$exit_value = $? >> 8; 
     252#$signal_num = $? & 127; 
     253#$dumped_core = $? & 128;  
     254#&writelog("ipodtranscode DEBUG MP4Box -fps 29.97 -add:$exit_value:$signal_num:$dumped_core"); 
     255 
     256        if (-e "$filenamebody.base.mp4"){ 
     257        system ("cd $recfolderpath ; MP4Box -add $filenamebody.aac $filenamebody.base.mp4"); 
     258#$exit_value = $? >> 8; 
     259#$signal_num = $? & 127; 
     260#$dumped_core = $? & 128;  
     261#&writelog("ipodtranscode DEBUG MP4Box -add $filenamebody.aac:$exit_value:$signal_num:$dumped_core"); 
     262        }else{ 
     263        &writelog("ipodtranscode ERR File not exist.$filenamebody.base.mp4"); 
     264        } 
     265 
     266
     267 
     268if ($filestatus <= $FILESTATUSTRANSCODEATOM){ 
     269        unlink("${mp4outdir}MAQ${mp4filenamestring}.MP4"); 
     270        # iPodヘッダ付加 
     271        &changefilestatus($pid,$FILESTATUSTRANSCODEATOM); 
     272        &writelog("ipodtranscode ATOM $filenamebody"); 
     273        #system ("/usr/local/bin/ffmpeg -y -i $filenamebody.base.mp4 -vcodec copy -acodec copy -f ipod ${mp4outdir}MAQ${mp4filenamestring}.MP4"); 
     274        system ("cd $recfolderpath ; MP4Box -ipod $filenamebody.base.mp4"); 
     275$exit_value = $? >> 8; 
     276$signal_num = $? & 127; 
     277$dumped_core = $? & 128; 
     278&writelog("ipodtranscode DEBUG MP4Box -ipod:$exit_value:$signal_num:$dumped_core"); 
     279        system("mv $filenamebody.base.mp4 ${mp4outdir}MAQ${mp4filenamestring}.MP4"); 
     280        &writelog("ipodtranscode mv $filenamebody.base.mp4 ${mp4outdir}MAQ${mp4filenamestring}.MP4"); 
     281# ipodtranscode mv /home/foltia/php/tv/1329-21-20080829-0017.base.mp4 /home/foltia/php/tv/1329.localized/mp4/MAQ-/home/foltia/php/tv/1329-21-20080829-0017.MP4 
     282 
     283
     284if ($filestatus <= $FILESTATUSTRANSCODECOMPLETE){ 
     285        # 中間ファイル消す 
     286        &changefilestatus($pid,$FILESTATUSTRANSCODECOMPLETE); 
     287        unlink("${filenamebody}_HD.m2t"); 
     288        unlink("${filenamebody}_tss.m2t"); 
     289        unlink("$filenamebody.264"); 
     290        unlink("$filenamebody.wav"); 
     291        unlink("$filenamebody.aac"); 
     292        unlink("$filenamebody.base.mp4"); 
     293         
     294        &updatemp4file(); 
     295 
     296
     297 
     298}else{ #デジタルかアナログか 
     299        #print "MPEG2\n"; 
     300        # アスペクト比 
     301        if ($aspect == 16){ 
     302        $cropopt = " -croptop 70 -cropbottom 60 -cropleft  8 -cropright 14 -aspect 16:9 "; 
     303        }else{ 
     304        $cropopt = " -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 "; 
     305        } 
    90306# クオリティごとに 
    91 if (($trconqty eq "")||($trconqty == 1)){#sample:src 106.6sec encode 82sec x0.77 382kbps @Celeron2.6GHz 
    92  
    93 $encodeoption = "-y -i $inputmpeg2 -vcodec xvid $cropopt -s 320x240 -b 300 -bt 128 -r 14.985 -bufsize 192 -maxrate 512 -minrate 0 -deinterlace -acodec aac -ab 128 -ar 24000 -ac 2 $movietitle ${mp4outdir}M4V${mp4filenamestring}.MP4"; 
     307if (($trconqty eq "")||($trconqty == 1)){ 
     308#$encodeoption = "-y -i $inputmpeg2 -vcodec xvid $cropopt -s 320x240 -b 300 -bt 128 -r 14.985 -bufsize 192 -maxrate 512 -minrate 0 -deinterlace -acodec aac -ab 128 -ar 24000 -ac 2 $movietitle ${mp4outdir}M4V${mp4filenamestring}.MP4"; 
    94309$mp4file = "${mp4outdir}M4V${mp4filenamestring}.MP4"; 
    95  
    96 }elsif($trconqty == 2){ #sample:src 106.6sec encode 117sec x1.1 597kbps @Celeron2.6GHz 
    97  
    98 $encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt -s 320x240 -b 300 -r 24 -acodec aac -ar 32000 -ac 2 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     310$encodeoption = "-y -i $inputmpeg2 vcodec libxvid $cropopt -s 320x240 -b 300 -bt 128 -r 14.985 -deinterlace -acodec libfaac -f ipod  ${mp4outdir}M4V${mp4filenamestring}.MP4"; 
     311#time ffmpeg -y  -i /home/foltia/php/tv/trcntest/nanoha-As-op.mpg -vcodec libxvid -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 -s 320x240 -b 300 -bt 128 -r 14.985 -deinterlace -acodec libfaac -f ipod M4V-Nanoha-As-OP.MP4 
     312# 32sec 
     313# 2.1MB 
     314}elsif($trconqty == 2){  
     315#$encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt -s 320x240 -b 300 -r 24 -acodec aac -ar 32000 -ac 2 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    99316$mp4file = "${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    100  
    101 }elsif($trconqty == 3){ #sample:src 106.6sec encode 364sec x3.4 528kbps @Celeron2.6GHz 
    102  
    103 $encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt  -acodec aac -ab 96 -vcodec h264  -maxrate 700 -minrate 0 -deinterlace -b 300 -ar 32000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -s 320x240 -r 30000/1001  -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     317$encodeoption = "-y -i $inputmpeg2 -vcodec libx264 -croptop 8 $cropopt -s 320x240 -b 300 -bt 128 -r 24 -deinterlace -acodec libfaac -f ipod  ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     318#time ffmpeg -y  -i /home/foltia/php/tv/trcntest/nanoha-As-op.mpg -vcodec libx264 -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 -s 320x240 -b 300 -bt 128 -r 24 -deinterlace -acodec libfaac -f ipod MAQ-Nanoha-As-OP.MP4 
     319# 2min22sec 
     320# 6.4MB 
     321}elsif($trconqty == 3){  
     322#$encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt  -acodec aac -ab 96 -vcodec h264  -maxrate 700 -minrate 0 -deinterlace -b 300 -ar 32000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -s 320x240 -r 30000/1001  -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    104323$mp4file = "${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    105  
    106 }elsif($trconqty == 4){ #sample:src 106.6sec encode 239sec x2.24 1036kbps @Celeron2.6GHz 
    107  
    108 $encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt -s 480x360 -b 400 -r 24 -acodec aac -ar 32000 -ac 2 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     324$encodeoption = "-y -i $inputmpeg2  -vcodec libx264 $cropopt -s 320x240 -b 380 -bt 128 -r 29.97 -deinterlace -acodec libfaac -f ipod  ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     325#time ffmpeg -y  -i /home/foltia/php/tv/trcntest/nanoha-As-op.mpg -vcodec libx264 -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 -s 320x240 -b 380 -bt 128 -r 29.97 -deinterlace -acodec libfaac -f ipod MAQ-Nanoha-As-OP.MP4 
     326#  2m53.912s 
     327# 7MB 
     328}elsif($trconqty == 4){ 
     329#$encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt -s 480x360 -b 400 -r 24 -acodec aac -ar 32000 -ac 2 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    109330$mp4file = "${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    110  
    111 }elsif($trconqty == 5){ #sample:src 106.6sec encode 1012sec x9.49 727kbps @Celeron2.6GHz 
    112  
    113 $encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt  -acodec aac -ab 96 -vcodec h264  -maxrate 700 -minrate 0 -deinterlace -b 400 -ar 32000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -s 480x360 -r 30000/1001  -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     331$encodeoption = "-y -i $inputmpeg2 -vcodec libx264 $cropopt -s 640x480 -b 500 -maxrate 700 -bt 128 -r 29.97 -deinterlace -acodec libfaac -f ipod ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     332#time ffmpeg -y  -i /home/foltia/php/tv/trcntest/nanoha-As-op.mpg -vcodec libx264 -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 -s 640x480 -b 500  -maxrate 700 -bt 128 -r 29.97 -deinterlace -acodec libfaac -f ipod MAQ-Nanoha-As-OP.MP4 
     333# 11m0.294s 
     334# 20MB 
     335}elsif($trconqty == 5){  
     336#$encodeoption = "-y -i $inputmpeg2  -target ipod -profile 51 -level 30 $cropopt  -acodec aac -ab 96 -vcodec h264  -maxrate 700 -minrate 0 -deinterlace -b 400 -ar 32000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -s 480x360 -r 30000/1001  -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 $movietitle ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    114337$mp4file = "${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
    115 
    116  
    117  
     338$encodeoption = "-y -i $inputmpeg2 -vcodec libx264 -croptop 8 $cropopt -s 640x480 -b 500  -maxrate 700 -bt 128 -r 29.97 -deinterlace -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -acodec libfaac -f ipod ${mp4outdir}MAQ${mp4filenamestring}.MP4"; 
     339#time ffmpeg -y  -i /home/foltia/php/tv/trcntest/nanoha-As-op.mpg -vcodec libx264 -croptop 8 -cropbottom 8 -cropleft  8 -cropright 14 -s 640x480 -b 500  -maxrate 700 -bt 128 -r 29.97 -deinterlace -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8  -acodec libfaac -f ipod MAQ-Nanoha-As-OP.MP4 
     340#  14m14.033s 
     341# 18MB 
     342
    118343 
    119344$encodeoptionlog = $encodeoption; 
     
    122347&writelog("ipodtranscode START QTY=$trconqty $encodeoptionlog"); 
    123348#print "ffmpeg $encodeoptionlog \n"; 
    124 system ("/usr/local/bin/ffmpeg  $encodeoption "); 
     349&changefilestatus($pid,$FILESTATUSTRANSCODEFFMPEG); 
     350system ("ffmpeg  $encodeoption "); 
    125351&writelog("ipodtranscode FFEND $inputmpeg2"); 
    126  
    127 &writelog("ipodtranscode mp4psp -p $mp4file $movietitleeuc"); 
    128 system("/usr/local/bin/mp4psp -p $mp4file '$movietitleeuc' "); 
    129 &writelog("ipodtranscode mp4psp COMPLETE  $mp4file "); 
    130  
     352&changefilestatus($pid,$FILESTATUSTRANSCODECOMPLETE); 
     353#もう要らなくなった #2008/11/14  
     354#&writelog("ipodtranscode mp4psp -p $mp4file $movietitleeuc"); 
     355#system("/usr/local/bin/mp4psp -p $mp4file '$movietitleeuc' "); 
     356#&writelog("ipodtranscode mp4psp COMPLETE  $mp4file "); 
     357 
     358&updatemp4file(); 
     359}#endif #デジタルかアナログか 
     360 
     361$counttranscodefiles = &counttranscodefiles(); 
     362############################ 
     363#一回で終らせるように 
     364#exit; 
     365}# end while 
     366#残りファイルがゼロなら 
     367&writelog("ipodtranscode ALL COMPLETE"); 
     368exit; 
     369 
     370#----------------------------------------------------------------------- 
     371sub mp4filenamestringbuild(){ 
     372#ファイル名決定 
     373#1329-19-20080814-2337.m2t 
     374my @mpegfilename = split(/\./,$dbparam[2]) ; 
     375my $pspfilname = "-".$mpegfilename[0] ; 
     376return("$pspfilname"); 
     377}#end sub mp4filenamestringbuild 
     378 
     379 
     380sub makethumbnail(){ 
     381#サムネール 
     382my $outputfilename = $inputmpeg2 ;#フルパス 
     383my $thmfilename = "MAQ${mp4filenamestring}.THM"; 
     384&writelog("ipodtranscode DEBUG thmfilename $thmfilename"); 
     385 
     386system ("mplayer -ss 00:01:20 -vo jpeg:outdir=$pspdirname -ao null -sstep 1 -frames 3  -v 3 $outputfilename"); 
     387 
     388&writelog("ipodtranscode DEBUG mplayer -ss 00:01:20 -vo jpeg:outdir=$pspdirname -ao null -sstep 1 -frames 3  -v 3 $outputfilename"); 
     389 
     390if (-e "$pspdirname/$thmfilename"){ 
     391$timestamp =`date "+%Y%m%d-%H%M%S"`; 
     392chomp $timestamp; 
     393        system("convert -crop 160x120+1+3 -resize 165x126\! $pspdirname/00000002.jpg $pspdirname/$thmfilename".$timestamp.".THM"); 
     394}else{ 
     395        system("convert -crop 160x120+1+3 -resize 165x126\! $pspdirname/00000002.jpg $pspdirname/$thmfilename"); 
     396
     397&writelog("ipodtranscode DEBUG convert -crop 160x120+1+3 -resize 165x126\! $pspdirname/00000002.jpg $pspdirname/$thmfilename"); 
     398 
     399system("rm -rf $pspdirname/0000000*.jpg "); 
     400&writelog("ipodtranscode DEBUG rm -rf $pspdirname/0000000*.jpg"); 
     401 
     402}#endsub makethumbnail 
     403 
     404sub updatemp4file(){ 
     405my $mp4filename = "MAQ${mp4filenamestring}.MP4"; 
     406 
     407if (-e "${mp4outdir}MAQ${mp4filenamestring}.MP4"){ 
     408# MP4ファイル名をPIDレコードに書き込み 
     409        $DBQuery =  "UPDATE foltia_subtitle SET PSPfilename = '$mp4filename' WHERE pid = '$pid' "; 
     410         $sth = $dbh->prepare($DBQuery); 
     411        $sth->execute(); 
     412&writelog("ipodtranscode UPDATEsubtitleDB $DBQuery"); 
     413 
     414# MP4ファイル名をfoltia_mp4files挿入 
     415        $DBQuery = "insert into foltia_mp4files values ('$tid','$mp4filename') "; 
     416         $sth = $dbh->prepare($DBQuery); 
     417        $sth->execute(); 
     418&writelog("ipodtranscode UPDATEmp4DB $DBQuery"); 
     419 
     420&changefilestatus($pid,$FILESTATUSALLCOMPLETE); 
     421}else{ 
     422&writelog("ipodtranscode ERR MP4 NOT EXIST $pid/$mp4filename"); 
     423
     424 
     425 
     426}#updatemp4file 
     427 
     428sub counttranscodefiles(){ 
     429my $DBQuery =  "SELECT count(*) FROM foltia_subtitle, foltia_program, foltia_m2pfiles  
     430WHERE filestatus >= $FILESTATUSRECEND AND filestatus < $FILESTATUSTRANSCODECOMPLETE  AND foltia_program.tid = foltia_subtitle.TID AND foltia_program.PSP = 1  AND foltia_m2pfiles.m2pfilename = foltia_subtitle.m2pfilename  "; 
     431$sth = $dbh->prepare($DBQuery); 
     432$sth->execute(); 
     433my @titlecount= $sth->fetchrow_array; 
     434 
     435return ($titlecount[0]); 
     436 
     437 
     438
  • trunk/install/perl/recwrap.pl

    r70 r83  
    11#!/usr/bin/perl 
    2 #usage recwrap.pl ch length(sec) [bitrate(5)] [TID] [NO]  [PID] 
     2#usage recwrap.pl ch length(sec) [bitrate(5)] [TID] [NO] [PID] [stationid] [digitalflag] [digitalband] [digitalch]  
    33# 
    44# Anime recording system foltia 
     
    3939$tid  = $ARGV[3] ; 
    4040$countno  = $ARGV[4] ; 
    41 $pid  = $ARGV[5] ; 
     41$pid = $ARGV[5] ; 
     42$stationid = $ARGV[6] ; 
     43$usedigital = $ARGV[7] ; 
     44$digitalstationband = $ARGV[8] ; 
     45$digitalch= $ARGV[9] ; 
     46 
     47#DB初期化 
     48        my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d", 
     49                $DBDriv,$DBName,$DBHost,$DBPort); 
     50         $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;; 
     51 
     52 
     53if ($usedigital == 1){ 
     54        $extension = ".m2t";#TSの拡張子 
     55}else{ 
     56        $extension = ".m2p";#MPEG2の拡張子 
     57
    4258 
    4359$outputfile = `date  +%Y%m%d-%H%M --date "1 min "`; 
    4460chomp($outputfile); 
     61 
    4562if ($tid == 0){ 
    46                 $outputfilename = "0--".$outputfile."-".$recch.".m2p"
     63                $outputfilename = "0--".$outputfile."-".$recch.$extension
    4764                $mp4newstylefilename = "-0--".$outputfile."-".$recch; 
    4865}else{ 
    4966        if ($countno == 0){ 
    50                 $outputfilename = $tid ."--".$outputfile.".m2p"
     67                $outputfilename = $tid ."--".$outputfile.$extension
    5168                $mp4newstylefilename = "-" . $tid ."--".$outputfile; 
    5269        }else{ 
    53                 $outputfilename = $tid ."-".$countno."-".$outputfile.".m2p"
     70                $outputfilename = $tid ."-".$countno."-".$outputfile.$extension
    5471                $mp4newstylefilename = "-" . $tid ."-".$countno."-".$outputfile; 
    5572        } 
    5673} 
     74 
     75if ($usedigital == 1){ 
     76#デジタルなら 
     77&writelog("recwrap RECSTART DIGITAL $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio"); 
     78#録画 
     79$starttime = (`date +%s`); 
     80$oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio"); 
     81$oserr = $oserr / 256; 
     82 
     83if ($oserr == 1){ 
     84        &writelog("recwrap ABORT recfile exist. [$outputfilename] $digitalstationband $digitalch $reclength $stationid 0  $outputfilename $tid $countno"); 
     85        exit; 
     86}elsif ($oserr == 2){ 
     87        &writelog("recwrap ERR 2:friio busy;retry."); 
     88        &continuousrecordingcheck;#もうすぐ終わる番組をkill 
     89        sleep(2); 
     90        $oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid N $outputfilename $tid $countno friio"); 
     91        $oserr = $oserr / 256; 
     92        if ($oserr == 2){ 
     93        &writelog("recwrap ERR 2:friio busy;Giving up digital recording."); 
     94        } 
     95}elsif ($oserr == 3){ 
     96&writelog("recwrap ABORT:ERR 3"); 
     97exit ; 
     98} 
     99}else{ 
    57100#リモコン操作 
    58101# $haveirdaunit = 1;リモコンつないでるかどうか確認 
     
    71114        exit; 
    72115        }#end if 
    73  
    74 &writelog("recwrap RECSTART $recch $reclength 0 $outputfilename $bitrate $tid $countno $pid"); 
     116# アナログ録画 
     117&writelog("recwrap RECSTART $recch $reclength 0 $outputfilename $bitrate $tid $countno $pid $usedigital $digitalstationband $digitalch"); 
     118 
    75119#録画 
    76120#system("$toolpath/perl/tvrecording.pl $recch $reclength 0 $outputfile $bitrate $tid $countno"); 
     
    83127        exit; 
    84128} 
     129 
     130}#endif #デジタル優先フラグ 
     131 
    85132#デバイスビジーで即死してないか検出 
    86133$now = (`date +%s`); 
    87134        if ($now < $starttime + 100){ #録画プロセス起動してから100秒以内に戻ってきてたら 
     135        $retrycounter == 0; 
    88136                while($now < $starttime + 100){ 
     137                        if($retrycounter >= 5){ 
     138                                &writelog("recwrap WARNING  Giving up recording."); 
     139                                last; 
     140                        } 
    89141                &writelog("recwrap retry recording $now $starttime"); 
     142                #アナログ録画 
    90143$starttime = (`date +%s`); 
     144if($outputfilename =~ /.m2t$/){ 
     145        $outputfilename =~ s/.m2t$/.m2p/; 
     146} 
    91147$oserr = system("$toolpath/perl/tvrecording.pl $recch $reclength N $outputfilename $bitrate $tid $countno"); 
    92148$now = (`date +%s`); 
     
    96152                                exit; 
    97153                        }# if 
     154                $retrycounter++; 
    98155                }# while 
    99156        } # if  
    100157 
    101  
    102158        &writelog("recwrap RECEND [$outputfilename] $recch $reclength 0 0 $bitrate $tid $countno $pid"); 
    103159 
    104 #DB初期化 
    105         my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d", 
    106                 $DBDriv,$DBName,$DBHost,$DBPort); 
    107          $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;; 
    108160 
    109161# m2pファイル名をPIDレコードに書き込み 
    110         $DBQuery =  "UPDATE  foltia_subtitle  SET  
    111         m2pfilename      = '$outputfilename'  
    112         WHERE pid =  '$pid' "; 
     162        $DBQuery =  "UPDATE foltia_subtitle SET m2pfilename = '$outputfilename' WHERE pid = '$pid' "; 
    113163         $sth = $dbh->prepare($DBQuery); 
    114164        $sth->execute(); 
    115 &writelog("recwrap UPDATEDB  $DBQuery"); 
     165&writelog("recwrap DEBUG UPDATEDB $DBQuery"); 
     166&changefilestatus($pid,$FILESTATUSRECEND); 
    116167 
    117168# m2pファイル名をPIDレコードに書き込み 
    118         $DBQuery =  "insert into foltia_m2pfiles values ('$outputfilename')"; 
     169        $DBQuery =  "insert into foltia_m2pfiles values ('$outputfilename')"; 
    119170         $sth = $dbh->prepare($DBQuery); 
    120171        $sth->execute(); 
    121 &writelog("recwrap UPDATEDB $DBQuery"); 
     172&writelog("recwrap DEBUG UPDATEDB $DBQuery"); 
    122173 
    123174# Starlight breaker向けキャプチャ画像作成 
    124175if (-e "$toolpath/perl/captureimagemaker.pl"){ 
    125176        &writelog("recwrap Call captureimagemaker $outputfilename"); 
     177&changefilestatus($pid,$FILESTATUSCAPTURE); 
    126178        system ("$toolpath/perl/captureimagemaker.pl $outputfilename"); 
    127 
    128  
    129  
    130  
    131 # PSP ------------------------------------------------------ 
    132 #PSPトラコン必要かどうか 
    133 $DBQuery =  "SELECT psp,aspect,title FROM  foltia_program WHERE tid = '$tid' "; 
     179&changefilestatus($pid,$FILESTATUSCAPEND); 
     180
     181 
     182 
     183 
     184# MPEG4 ------------------------------------------------------ 
     185#MPEG4トラコン必要かどうか 
     186$DBQuery =  "SELECT psp,aspect,title FROM foltia_program WHERE tid = '$tid' "; 
    134187         $sth = $dbh->prepare($DBQuery); 
    135188        $sth->execute(); 
    136189 @psptrcn= $sth->fetchrow_array; 
    137  if ($psptrcn[0]  == 1 ){#トラコン番組 
    138  
    139  
    140 #PSPムービーディレクトリがアルかどうか 
     190if ($psptrcn[0]  == 1 ){#トラコン番組 
     191&writelog("recwrap Launch ipodtranscode.pl"); 
     192exec ("$toolpath/perl/ipodtranscode.pl"); 
     193exit; 
     194
     195# ここから下は旧エンコード#2008/12/23  
     196# 新エンコードはDBを見て未完了MPEG2を順次トラコン処理、 
     197# 分散エンコードもきっとラクチンに対応可能 
     198# 新エンコードではXviD/M4VスタイルとPSPファイル名対応を廃止 
     199 
     200&changefilestatus($pid,80); 
     201#MPEG4ムービーディレクトリがあるかどうか 
    141202  
    142203#TIDが100以上の3桁の場合はそのまま 
    143204my $pspfilnamehd = ""; 
    144205 
    145         $pspfilnamehd = $tid; 
     206$pspfilnamehd = $tid; 
     207&makemp4dir($tid); 
    146208$pspdirname = "$tid.localized/"; 
    147209$pspdirname = $recfolderpath."/".$pspdirname; 
    148210 
    149211#なければ作る 
    150 unless (-e $pspdirname ){ 
    151       system("$toolpath/perl/mklocalizeddir.pl $tid"); 
    152       #&writelog("recwrap mkdir $pspdirname"); 
    153 
     212#unless (-e $pspdirname ){ 
     213#     system("$toolpath/perl/mklocalizeddir.pl $tid"); 
     214#     #&writelog("recwrap mkdir $pspdirname"); 
     215#
    154216$pspdirname = "$tid.localized/mp4/"; 
    155217$pspdirname = $recfolderpath."/".$pspdirname; 
    156218#なければ作る 
    157 unless (-e $pspdirname ){ 
    158       mkdir $pspdirname ,0777; 
    159       #&writelog("recwrap mkdir $pspdirname"); 
    160 
     219#unless (-e $pspdirname ){ 
     220#     mkdir $pspdirname ,0777; 
     221#     #&writelog("recwrap mkdir $pspdirname"); 
     222#
    161223 
    162224#ファイル名決定 
     
    350412 
    351413# MP4ファイル名をPIDレコードに書き込み 
    352         $DBQuery =  "UPDATE  foltia_subtitle  SET  
    353         PSPfilename      = '$mp4filename'  
    354         WHERE pid =  '$pid' "; 
     414        $DBQuery =  "UPDATE foltia_subtitle SET PSPfilename = '$mp4filename' WHERE pid = '$pid' "; 
    355415         $sth = $dbh->prepare($DBQuery); 
    356416        $sth->execute(); 
     
    358418 
    359419# MP4ファイル名をfoltia_mp4files挿入 
    360         $DBQuery = "insert into foltia_mp4files values ('$tid','$mp4filename') "; 
     420        $DBQuery = "insert into foltia_mp4files values ('$tid','$mp4filename') "; 
    361421         $sth = $dbh->prepare($DBQuery); 
    362422        $sth->execute(); 
    363423&writelog("recwrap UPDATEmp4DB  $DBQuery"); 
    364424 
     425&changefilestatus($pid,200); 
    365426}#PSPトラコンあり 
    366427 
    367  
    368  
    369  
     428sub continuousrecordingcheck(){ 
     429my $now = `date  +%s --date "2 min "`; 
     430&writelog("recwrap DEBUG continuousrecordingcheck() now $now"); 
     431my @processes =`ps ax | grep recfriio`; 
     432 
     433my $psline = ""; 
     434my @processline = ""; 
     435my $pid = ""; 
     436my @pid; 
     437my $sth; 
     438foreach (@processes){ 
     439        if (/friiodetect/) { 
     440                if (/^.[0-9]*\s/){ 
     441                        push(@pid, $&); 
     442                }#if 
     443        }#if 
     444}#foreach 
     445 
     446if (@pid > 0){ 
     447my @filenameparts; 
     448my $tid = ""; 
     449my $startdate = ""; 
     450my $starttime = ""; 
     451my $startdatetime = ""; 
     452my @recfile; 
     453my $endtime = ""; 
     454my $endtimeepoch = ""; 
     455foreach $pid (@pid){ 
     456#print "DEBUG  PID $pid\n"; 
     457&writelog("recwrap DEBUG continuousrecordingcheck() PID $pid"); 
     458 
     459        my @lsofoutput = `/usr/sbin/lsof -p $pid`; 
     460        my $filename = ""; 
     461        #print "recfolferpath $recfolderpath\n"; 
     462        foreach (@lsofoutput){ 
     463                if (/m2t/){ 
     464                @processline = split(/\s+/,$_); 
     465                $filename = $processline[8]; 
     466                #print "DEBUG  $_ \n"; 
     467                #print "DEBUG $processline[0]/$processline[1]/$processline[2]/$processline[3]/$processline[4]/$processline[5]/$processline[6]/$processline[7]/$processline[8] \n"; 
     468                $filename =~ s/$recfolderpath\///; 
     469                #print "DEBUG FILENAME $filename\n"; 
     470                        &writelog("recwrap DEBUG continuousrecordingcheck()  FILENAME $filename"); 
     471                # 1520-9-20081201-0230.m2t 
     472                @filenameparts = split(/-/,$filename); 
     473                $tid = $filenameparts[0]; 
     474                $startdate = $filenameparts[2]; 
     475                $starttime = $filenameparts[3]; 
     476                $startdatetime = $filenameparts[2].$filenameparts[3]; 
     477                #DBから録画中番組のデータ探す 
     478        $DBQuery =  " 
     479SELECT foltia_subtitle.tid,foltia_subtitle.countno,foltia_subtitle.subtitle,foltia_subtitle.startdatetime ,foltia_subtitle.enddatetime ,foltia_subtitle.lengthmin ,foltia_tvrecord.bitrate , foltia_subtitle.startoffset , foltia_subtitle.pid ,foltia_tvrecord.digital  
     480FROM foltia_subtitle ,foltia_tvrecord  
     481WHERE  
     482foltia_tvrecord.tid = foltia_subtitle.tid AND  
     483foltia_tvrecord.tid = $tid AND  
     484foltia_subtitle.startdatetime = $startdatetime AND  
     485foltia_tvrecord.digital = 1"; 
     486        &writelog("recwrap DEBUG continuousrecordingcheck() $DBQuery"); 
     487        $sth = $dbh->prepare($DBQuery); 
     488        &writelog("recwrap DEBUG continuousrecordingcheck() prepare"); 
     489        $sth->execute(); 
     490        &writelog("recwrap DEBUG continuousrecordingcheck() execute"); 
     491        @recfile = $sth->fetchrow_array; 
     492        &writelog("recwrap DEBUG continuousrecordingcheck() @recfile  $recfile[0] $recfile[1] $recfile[2] $recfile[3] $recfile[4] $recfile[5] $recfile[6] $recfile[7] $recfile[8] $recfile[9] "); 
     493        #終了時刻 
     494        $endtime = $recfile[4]; 
     495        $endtimeepoch = &foldate2epoch($endtime); 
     496        &writelog("recwrap DEBUG continuousrecordingcheck() $recfile[0] $recfile[1] $recfile[2] $recfile[3] $recfile[4] $recfile[5] endtimeepoch $endtimeepoch"); 
     497        if ($endtimeepoch < $now){#まもなく終わる番組なら 
     498                #kill 
     499                system("kill $pid"); 
     500                &writelog("recwrap recording process killed $pid/$endtimeepoch/$now"); 
     501        } 
     502                }#endif m2t 
     503        }#foreach lsofoutput 
     504}#foreach 
     505}else{ 
     506#print "DEBUG fecfriio NO PID\n"; 
     507&writelog("recwrap No recording process killed."); 
     508
     509}#endsub 
     510 
     511 
     512 
  • trunk/install/perl/tvrecording.pl

    r79 r83  
    55# 
    66#tvrecording.pl 
    7 # record-v4l2.plに準備処理を加えた録画モジュール。 
     7# record-v4l2.plを呼びだす録画モジュール。 
    88# 
    99#usage tvrecording.pl ch length(sec) [clip No(000-)] [filename] [bitrate(5)] [TID] [NO] [/dev/video0] 
     
    4444#$startupsleeptime = 52;                                        #process wait(MAX60sec) 
    4545$startupsleeptime = 37;                                 #process wait(MAX60sec) 
    46 #$startupsleeptime = 1;                                 #process wait(MAX60sec) 
     46 
    4747 
    4848#------------------------------- 
     
    6464        $recfolderpath = '/home/foltia/php/tv';          
    6565}#end sub getRecPath 
    66  
     66
     67# -- ここからメイン ---------------------------- 
    6768#準備 
    6869&prepare; 
     
    7475$reclengthsec = $reclengthsec + $extendrecendsec ; 
    7576 
     77&callrecordv4l; 
     78 
    7679&writelog("tvrecording:$recch:$reclengthsec:$outputfile:$recdevice:$capturedeviceinputnum:$ivtvrecch:$stdbitrate:$peakbitrate"); 
    7780 
    78 #------------------------------ 
    79  
    80  
     81# -- これ以下サブルーチン ---------------------------- 
    8182sub chkextinput{ 
    8283 
     
    8788                $capturedeviceinputnum = 7 ; 
    8889                } 
    89         $capturedeviceinputName = "S-Video 0"; 
     90        $capturedeviceinputName = "S-Video 1"; 
    9091        $ivtvrecch = ''; 
    9192}elsif($recch == -1){ 
     
    9596                $capturedeviceinputnum = 8; 
    9697                } 
    97         $capturedeviceinputName = "Composite 0"; 
     98        $capturedeviceinputName = "Composite 1"; 
    9899        $ivtvrecch = ''; 
    99100}else{ 
     
    103104                $capturedeviceinputnum = 6 ; 
    104105                } 
    105         $capturedeviceinputName = "Tuner 0"; 
     106        $capturedeviceinputName = "Tuner 1"; 
    106107        $ivtvrecch = $recch; 
    107108} 
     
    304305                $outputfile = $ARGV[3]; 
    305306                $outputfile = &filenameinjectioncheck($outputfile); 
     307                $outputfilewithoutpath = $outputfile ; 
    306308                $outputfile = $outputpath.$outputfile ; 
    307309#               $outputfile .= "$ARGV[3]";               
    308310#               $outputfile .= `date  +%Y%m%d-%H%M --date "1 min "`; 
    309  &writelog("tvrecording:  DEBUG ARGV[3] ne null  \$outputfile $outputfile "); 
    310  
     311                &writelog("tvrecording:  DEBUG ARGV[2] ne null  \$outputfile $outputfile "); 
    311312        }else{ 
    312         $outputfile .= `date  +%Y%m%d-%H%M --date "1 min "`; 
    313         chomp($outputfile); 
    314         $outputfile .= ".m2p"; 
    315 &writelog("tvrecording:  DEBUG ARGV[3] is null  \$outputfile $outputfile ")
    316  
     313               $outputfile .= `date  +%Y%m%d-%H%M --date "1 min "`; 
     314               chomp($outputfile); 
     315               $outputfile .= ".m2p"; 
     316               $outputfilewithoutpath = $outputfile
     317                &writelog("tvrecording:  DEBUG ARGV[2] is null  \$outputfile $outputfile "); 
    317318        } 
    318319 
     
    341342}#end setbitrate 
    342343 
    343 #------------------------------------------------------------------------------------------------- 
    344 # record-v4l2.pl created by James A. Pattie <james@pcxperience.com> 04/10/2003 
    345 # Copyright 2003 
    346 # Purpose: to record from the specified channel for the specified amount 
    347 # of time to the video OutputDirectory under the channel-start time name as video.mpg. 
    348  
    349 
    350 # You can always get the latest version of this script at 
    351 # http://www.pcxperience.org/ 
    352 
    353  
    354 #2003.11.18     patched by DCC-JPL 
    355  
    356 # 20030425 - 1.4 - Added devfs support based upon patch submitted by 
    357 #                  Jonathan Kolb <jkolb-ivtv@greyshift.net> 
    358 # 20030426 - 1.5 - Imported the ptune.pl functionality 
    359 # 20030426 - 1.6 - moved -F -> -L, -F now lets you specify the frequency to tune to. 
    360 # 20030427 - 1.7 - renamed to record_ivtv.pl per Kevin's request.  Added -R option. 
    361 # 20030430 - 1.8 - fixing some comparisons that needed to be strings, etc. 
    362 # 20030504 - 1.9 - Migrating to Video::ivtv for video resolution support. 
    363 # 20030505 - 1.10- Replaced open w/ sysopen but it doesn't make a difference. 
    364 #                  Starting to replace the Standard code w/ Video::ivtv methods. 
    365 #                  Added the version numbers that I require to the use statements. 
    366 # 20030507 - 1.11- Migrated to using get/setFrequency from Video::ivtv 0.03. 
    367 # 20030510 - 1.12- Migrated to using get/setInput from Video::ivtv 0.04.  Moved to using 
    368 #                  the exported method names rather than Video::ivtv::method(). 
    369 #                  Converted to using enumerateStandard(). 
    370 #                  Fixed the condition where switching Video Standards will most likely 
    371 #                  not get the correct channel and so would switch back with channel = 0 
    372 #                  which is invalid.  In this case I store the previous frequency, do the 
    373 #                  channel change but signal to restore the previous frequency on cleanup. 
    374 #                  Converted to using enumerateInput(). 
    375 # 20030512 - 1.13- Added initial support for setting the bitrate/bitrate_peak values. 
    376 # 20030513 - 1.14- Tweaked the bitrate values to be closer to real DVD bitrates. 
    377 #                  Added support for the .ivtvrc config file and User Profiles. 
    378 # 20030516 - 1.15- Updated to the OO interface that Video::ivtv 0.06 now requires. 
    379 #                  Cleaned up a lot of the global variables into a settings hash. 
    380 #                  Made the -S command add any config items you specified on the command line 
    381 #                  that were not in the Profile being updated.  This way you can add new items. 
    382 #                  Made the config file work from a mapping hash so that we can easily add/remove 
    383 #                  config items in the future. 
    384 # 20030518 - 1.16- Fixed a Frequency bug that happened when changing Video Standards and the 
    385 #                  Frequency came from a user specified Profile. 
    386 # 20030519 - 1.17- Adding the rest of the Codec related options to the config file / defaults. 
    387 #                  Switched to using Getopt::Long.  You can specify all config file options at 
    388 #                  least by a --long version and still by the original -X command option. 
    389 #                  Cleaned up the option parsing code to take advantage of the mappings hash. 
    390 # 20030520 - 1.18- Fixing the handling of the Profile command line option. 
    391 # 20030524 - 1.19- Cleaned up the output for -L/--list-freqtable.  Changed --list -> --list-freqtable. 
    392 #                  Added support to detect the v4l2 driver in use and disable the ivtv "enhancements" 
    393 #                  if driver != "ivtv". 
    394 #                  Renamed to record-v4l2.pl to reflect the ability of this program to record from any 
    395 #                  v4l2 device but with special support for the ivtv driver. 
    396 # 20030524 - 1.20- Improving the Ctrl-C handling (cleanup before dying).  It may take a second or two 
    397 #                  before the program exits, but it should exit after resetting anything it changed, unless 
    398 #                  you had specified not to reset the card. 
    399 #                  Allow layering of profiles by calling -P/--profile multiple times.  Each profile will 
    400 #                  be layered over the last.  You will not be able to create/update a profile if you 
    401 #                  specify more than one though. 
    402 #                  Fixed a bug that would cause a parameter from the profile to be set n times, where n was 
    403 #                  the number of characters in the mapping string that consisted of the single letter | and 
    404 #                  the long command option name.  Ex:  Channel has 'c|channel' so the Channel value was being 
    405 #                  set 9 times instead of just the first time if it was in the profile. 
    406 # 20030525 - 1.21- Fixed devfsd detection code as it was overriding what came from the config file. 
    407 #                  Adding --no-record option so that we can start to implement the replacement functionality for 
    408 #                  ptune.pl (ie.  Set all values and then exit, do not reset the card and do not capture) 
    409 # 20030607 - 1.22- Adding --directory-format and --date-format options so that the user can specify the 
    410 #                  naming convention to use when specifying the directory the output file should be put in. 
    411 #                  Tweaked some of the defaults. 
    412 #                  Create the config file if it doesn't exist, regardless of the --save flag being specified. 
    413 #                  Added method error() to output an error condition that doesn't warrant the whole usage and 
    414 #                  converted all relevant usage() calls to error() calls. 
    415 #                  Added option --debug to dynamically on the fly enable debug output. 
    416 # 20030609 - 1.23- Added option --list-channels to display the currently selected frequency tables contents. 
    417 #                  Changed the default output directory to '.'. 
    418 #                  Moved $debug -> $settings{Debug} so it can be stored in the config file.  This allows you to 
    419 #                  turn debugging on for only certain profiles, etc. 
    420 #                  Restructured some of the validity tests to only happen as long as we are recording since they 
    421 #                  do not need to be validated when we are not recording.  Mainly to do with the output stuff. 
    422 # 20030610 - 1.24- Moved the tunerNum variable into the config file: TunerNum 
    423 #                  Added --tuner-num option to dynamically set it. 
    424 # 20030614 - 1.25- I now require Video::ivtv 0.09 to make sure everyone is using the version that fixes the known 
    425 #                  reported segfault issues. 
    426 #                  Added freqtable "custom" support so that people using the new feature in ptune-ui.pl and have 
    427 #                  set their default frequency table to be "custom" will just work when they specify channel X, etc. 
    428 #                  I'm now sorting the command line input since otherwise I can't guarantee the order options get 
    429 #                  processed in, but even that is wrong.  I need to use Tie::IxHash, but that isn't standard. 
    430 # 20030626 - 1.26- Updated to cover the audio -> audio_bitmask changes that Video::ivtv 0.11 implemented to cover 
    431 #                  the ivtv_ioctl_codec structure changes. 
    432 #                  Implemented config file versioning so that I know when the Audio entry needs to be updated in case it 
    433 #                  comes back in a future version of the ivtv_ioctl_codec structure. 
    434 # 20030628 - 1.27- Adding --list-inputs and --list-standards to display the available inputs and video standards. 
    435 # 20030713 - 1.28- Added code to make sure the codec properties are proper when switching standard to PAL/SECAM. 
    436 #                  Added config options SetMSPMatrix, MSPInput, MSPOutput, MSPSleep to allow the user to specify if they 
    437 #                  want the msp matrix updated any time the Video Standard is changed and to specify what they want programmed. 
    438 #                  Bumping the config file version to 2 to account for the new options. 
    439 # 20030715 - 1.29- Adding the missing msp matrix reset code in the reset section. 
    440 #                  Adding codec checks to make sure that they are right for NTSC. 
    441 #                  Made it legal to specify the channel by itself without -c/--channel. 
    442  
    443  
    444 #use strict; 
    445 use Getopt::Long qw(:config no_ignore_case bundling); 
    446 use Fcntl; 
    447 use Video::Frequencies 0.03; 
    448 use Video::ivtv 0.12; 
    449 use Config::IniFiles; 
    450  
    451 my $version="1.29"; 
    452 my $cfgVersion = "2"; 
    453 my $cfgVersionStr = "_configVersion_";  # hopefully unique [defaults] value to let me know what version the config file is. 
    454  
    455 my @capabilities = ();  # The cards capabilities 
    456  
    457 my %settings = ( 
    458   Channel           =>  $ivtvrecch ,            # default to the ivtv default channel 
    459   RecordDuration    => $reclengthsec ,          # default to 59 minutes 50 seconds (in seconds) - This lets 2 back to back cron jobs work! 
    460   InputNum          => $capturedeviceinputnum ,      # TV-Tuner 0 on GV-MVP/RX $capturedeviceinputnum  
    461   InputName         => "$capturedeviceinputName", 
    462   OutputDirectory   => "$recfolderpath", 
    463   VideoDevice       => "$recdevice", 
    464   VideoWidth        => "720",   # 720x480-fullscreen NTSC 
    465   VideoHeight       => "480", 
    466   VideoStandard     => "NTSC",  # NTSC, PAL or SECAM 
    467   VideoType         => "mpeg",  # mpeg, yuv 
    468   Bitrate           => "$stdbitrate", 
    469   PeakBitrate       => "$peakbitrate",  # peak bitrate 
    470   Aspect            => 2, 
    471   AudioBitmask      => 0x00e9, 
    472   BFrames           => 3, 
    473   DNRMode           => 0, 
    474   DNRSpatial        => 0, 
    475   DNRTemporal       => 0, 
    476   DNRType           => 0, 
    477   Framerate         => 0, 
    478   FramesPerGOP      => 15, 
    479   GOPClosure        => 1, 
    480   Pulldown          => 0, 
    481   StreamType        => 0,  # 10 = DVD format (almost) 
    482   OutputFileName    => "$outputfile", 
    483   FrequencyTable    => "$frequencyTable",  # default to NTSC_CABLE mapping. 
    484   Frequency         => "", # user specified frequency. 
    485   ResetCardSettings => 1, 
    486   ConfigFileName    => "$ENV{HOME}/.ivtvrc", 
    487   UpdateConfigFile  => 0, 
    488   UseConfigFile     => 0, 
    489   UsingIvtvDriver   => 1,  # default to being able to use the ivtv "enhancements". 
    490   DontRecord        => 0,  # default to always recording data. 
    491   DirectoryFormatString => " ", # format string used to define the sub directory under OutputDirectory 
    492   DateTimeFormatString  => "+%Y%m%d-%H%M", # format string used to represent the date/time if the user wants it in their DirectoryFormatString 
    493   # define the Codec related min/max values 
    494   minBitrate        => 1, 
    495   maxBitrate        => 14500000, 
    496   minPeakBitrate    => 1500, 
    497   maxPeakBitrate    => 16000000, 
    498   # msp matrix settings 
    499   SetMSPMatrix      => 1, 
    500   MSPInput          => 3, 
    501   MSPOutput         => 1, 
    502   MSPSleep          => 2,  # number of seconds the card needs before we can set the msp matrix. 
    503   # other settings 
    504   Debug             => 0,#DEBUG 
    505   TunerNum          => 0, 
    506 ); 
    507  
    508  
    509 print " $settings{InputNum} / $settings{InputName} /IVTVRECCH:$settings{Channel}/$recdevice  \n\n" if $settings{Debug}; 
    510  
    511  
    512 my $result=""; 
    513 my @profileNames=(); # list of user defined sections to work with in the config file. 
    514 my %configIni;      # config hash we tie to for Config::IniFiles. 
    515 my $ivtvObj = Video::ivtv->new(); 
    516  
    517 # map the Settings/Config file parameter to the command line variable that specifies it. 
    518 my %mappings = ( 
    519     "Channel"           => "c|channel", 
    520     "RecordDuration"    => "t|duration", 
    521     "InputNum"          => "i|inputnum", 
    522     "InputName"         => "I|inputname", 
    523     "OutputDirectory"   => "D|directory", 
    524     "VideoDevice"       => "d|input", 
    525     "VideoWidth"        => "W|width", 
    526     "VideoHeight"       => "H|height", 
    527     "VideoStandard"     => "s|standard", 
    528     "VideoType"         => "T|type", 
    529     "Bitrate"           => "b|bitrate", 
    530     "PeakBitrate"       => "B|peakbitrate", 
    531     "Aspect"            => "aspect", 
    532     "AudioBitmask"      => "audio-bitmask", 
    533     "BFrames"           => "bframes", 
    534     "DNRMode"           => "dnrmode", 
    535     "DNRSpatial"        => "dnrspatial", 
    536     "DNRTemporal"       => "dnrtemporal", 
    537     "DNRType"           => "dnrtype", 
    538     "Framerate"         => "framerate", 
    539     "FramesPerGOP"      => "framespergop", 
    540     "GOPClosure"        => "gopclosure", 
    541     "Pulldown"          => "pulldown", 
    542     "StreamType"        => "streamtype", 
    543     "OutputFileName"    => "o|output", 
    544     "FrequencyTable"    => "f|freqtable", 
    545     "Frequency"         => "F|frequency", 
    546     "ResetCardSettings" => "R|noreset", 
    547     "DirectoryFormatString" => "directory-format", 
    548     "DateTimeFormatString"  => "date-format", 
    549     "Debug"             => "debug", 
    550     "TunerNum"          => "tuner-num", 
    551     "SetMSPMatrix"      => "set-msp-matrix", 
    552     "MSPInput"          => "msp-input", 
    553     "MSPOutput"         => "msp-output", 
    554     "MSPSleep"          => "msp-sleep", 
    555     "OutputMPGFileName"   => "outputmpgfilename", 
    556   ); 
    557  
    558 my %codecMappings = ( 
    559     "Aspect"       => "aspect", 
    560     "AudioBitmask" => "audio_bitmask", 
    561     "BFrames"      => "bframes", 
    562     "Bitrate"      => "bitrate", 
    563     "PeakBitrate"  => "bitrate_peak", 
    564     "DNRMode"      => "dnr_mode", 
    565     "DNRSpatial"   => "dnr_spatial", 
    566     "DNRTemporal"  => "dnr_temporal", 
    567     "DNRType"      => "dnr_type", 
    568     "Framerate"    => "framerate", 
    569     "FramesPerGOP" => "framespergop", 
    570     "GOPClosure"   => "gop_closure", 
    571     "Pulldown"     => "pulldown", 
    572     "StreamType"   => "stream_type", 
    573   ); 
    574  
    575 # check for devfs support 
    576 if ( -e "/dev/.devfsd" ) 
    577 
    578   $settings{VideoDevice} = "/dev/v4l/video0"; 
    579 
    580  
    581 ## check for the config file 
    582 #if (-f $settings{ConfigFileName}) 
    583 #{ 
    584 #  $settings{UseConfigFile} = 1; 
    585 
    586 #  # tie to it. 
    587 #  tie %configIni, 'Config::IniFiles', (-file => $settings{ConfigFileName}) or die "Error: Opening config file '$settings{ConfigFileName}' failed! $!\n"; 
    588 
    589 #  my $profile = "defaults"; 
    590 #  if (exists $configIni{$profile}) 
    591 #  { 
    592 #    my $saveFile = 0; 
    593 #    # check version of the config file. 
    594 #    if (!exists $configIni{$profile}{$cfgVersionStr}) 
    595 #    { 
    596 #      print "Updating config file to version 1...\n"; 
    597 
    598 #      # first version config file!  Update the Audio -> AudioBitmask entries. 
    599 #      $configIni{$profile}{$cfgVersionStr} = 1; 
    600 
    601 #      # find all entries that have Audio and move to AudioBitmask. 
    602 #      foreach my $p (keys %configIni) 
    603 #      { 
    604 #        if (exists $configIni{$p}{Audio}) 
    605 #        { 
    606 #          $configIni{$p}{AudioBitmask} = $configIni{$p}{Audio}; 
    607 #          delete $configIni{$p}{Audio}; 
    608 #        } 
    609 #      } 
    610 #       
    611 #      $saveFile = 1;  # signal we need to save the config changes. 
    612 #    } 
    613 #    if ($configIni{$profile}{$cfgVersionStr} != $cfgVersion) 
    614 #    { 
    615 #      # we need to upgrade 
    616 #      if ($configIni{$profile}{$cfgVersionStr} == 1) 
    617 #      { 
    618 #        print "Updating config file to version 2...\n"; 
    619 #        # add the MSP Matrix related options. 
    620 #        $configIni{$profile}{SetMSPMatrix} = $settings{SetMSPMatrix}; 
    621 #        $configIni{$profile}{MSPInput} = $settings{MSPInput}; 
    622 #        $configIni{$profile}{MSPOutput} = $settings{MSPOutput}; 
    623 #        $configIni{$profile}{MSPSleep} = $settings{MSPSleep}; 
    624 #        $configIni{$profile}{$cfgVersionStr} = 2; 
    625 #        $saveFile = 1; 
    626 #      } 
    627 #    } 
    628 
    629 #    if ($saveFile) 
    630 #    { 
    631 #      # now save the updated config file before we continue. 
    632 #      tied(%configIni)->RewriteConfig or die "Error: Writing config file '$settings{ConfigFileName}' failed!  $!\n"; 
    633 #    } 
    634 
    635 #    # update the defaults stored. 
    636 #    foreach my $arg (keys %mappings) 
    637 #    { 
    638 #      if (exists $configIni{$profile}{$arg}) 
    639 #      { 
    640 #        $settings{$arg} = $configIni{$profile}{$arg}; 
    641 #        print "settings{$arg} = '" . $settings{$arg} . "'\n"; 
    642 #      } 
    643 #    } 
    644 #  } 
    645 #  else 
    646 #  { 
    647 #    print "Warning: config file '$settings{ConfigFileName}' exists but does not have the\n[$profile] section!  Use -S to create it without specifying -P.\n\n"; 
    648 #  } 
    649 #} 
    650 #else  # create the config file 
    651 #{ 
    652 #  print "Auto Creating config file $settings{ConfigFileName}...\n"; 
    653 #  my $profile = "defaults"; 
    654 
    655 #  # we have to create the config file and tie to it. 
    656 #  tie %configIni, 'Config::IniFiles', () or die "Error: Initializing config file '$settings{ConfigFileName}' failed! $!\n"; 
    657 
    658 #  # now set the name to work with. 
    659 #  tied(%configIni)->SetFileName($settings{ConfigFileName}) or die "Error: Setting config file to '$settings{ConfigFileName}' failed! $!\n"; 
    660 
    661 #  $configIni{$profile} = {};  # make sure the section exists. 
    662 
    663 #  foreach my $arg (keys %mappings) 
    664 #  { 
    665 #    $configIni{$profile}{$arg} = $settings{$arg}; 
    666 #    print "configIni{$profile}{$arg} = '" . $settings{$arg} . "'\n" if $settings{Debug}; 
    667 #  } 
    668 
    669 #  # set the config file version 
    670 #  $configIni{$profile}{$cfgVersionStr} = $cfgVersion; 
    671 
    672 #  # write the config file out. 
    673 #  tied(%configIni)->RewriteConfig or die "Error: Writing config file '$settings{ConfigFileName}' failed!  $!\n"; 
    674 #} 
    675  
    676 # build up the "custom" frequency table 
    677 my %customMap = (); 
    678 foreach my $profileName (keys %configIni) 
    679 
    680   next if $profileName =~ /^(defaults)$/; 
    681  
    682   if (exists $configIni{$profileName}{Frequency}) 
    683   { 
    684     $customMap{$profileName} = $configIni{$profileName}{Frequency}; 
    685   } 
    686 
    687 $CHANLIST{custom} = \%customMap; 
    688  
    689 # enumerations 
    690 my @standards; 
    691 my %name2std; 
    692 my @inputs; 
    693 my %name2input; 
    694 my @codecInfo;        # stores the Codec Info 
    695 my @newCodecInfo;     # the version we mess with. 
    696 # Current settings (Input, Channel, Standard) 
    697 my $curinput; 
    698 my $curinputName; 
    699 my $std; 
    700 my $curstd = "???"; 
    701 my $curStandard = 0;  # numeric representation. 
    702 my $curChannel = 0; 
    703 my $curFrequency = 0; 
    704  
    705 my $tuner; 
    706 my $err; 
    707 my $v4l2input; 
    708  
    709 my $tmpDirectoryStr = formatDirectoryString(); 
    710 my $versionStr = "record-v4l2.pl $version for use with http://ivtv.sf.net/"; 
    711 my $usageStr = <<"END_OF_USAGE"; 
    712 $versionStr 
    713  
    714 Usage: record-v4l2.pl [--channel CHANNEL] [--duration TIME] 
    715        [--directory DIRECTORY] [--output OUTPUT] 
    716        [--directory-format FORMAT] [--date-format FORMAT] 
    717        [--input VIDEO_DEV][--width WIDTH --height HEIGHT] 
    718        [--standard STANDARD] [--type TYPE] 
    719        [--inputnum INPUT#] [--inputname INPUT NAME] 
    720        [--freqtable FREQENCY MAP] [--frequency FREQUENCY] 
    721        [--bitrate BITRATE] [--peakbitrate PEAK_BITRATE] 
    722        [--set-msp-matrix BOOL] [--msp-sleep SLEEP] 
    723        [--msp-input INPUT] [--msp-output OUTPUT] 
    724        [--profile PROFILE] [--list-freqtable] [--list-channels] 
    725        [--no-record] [--noreset] [--save] [--help] [--version] 
    726        [--aspect ASPECT] [--audio-bitmask AUDIO-BITMASK] [--bframes BFRAMES] 
    727        [--dnrmode DNRMODE] [--dnrspatial DNRSPATIAL] 
    728        [--dnrtemporal DNRTEMPORAL] [--dnrtype DNRTYPE] 
    729        [--framerate FRAMERATE] [--framespergop FRAMESPERGOP] 
    730        [--gopclosure GOPCLOSURE] [--pulldown PULLDOWN] 
    731        [--streamtype STREAMTYPE] [--debug] 
    732        [--tuner-num TUNERNUM] 
    733        [--list-inputs] [--list-standards] [CHANNEL] 
    734  
    735   -c/--channel CHANNEL: channel number to switch to 
    736       NOTE: You can also specify the channel by itself. 
    737             Ex.  record-v4l2.pl 73 
    738             would change to channel 73 using the default settings 
    739             or the settings from your ~/.ivtvrc config file. 
    740   -t/--duration TIME: number of seconds to record 
    741   -D/--directory DIRECTORY: Base directory to record into 
    742   --directory-format FORMAT: format string that specifies the 
    743        sub-directory to create under the base directory that 
    744        the output file will be created in.  This can be empty 
    745        to indicate no sub-directory should be created. 
    746  
    747        Available tokens are: 
    748          %d - date formatted by --date-format 
    749          %I - input name recorded from 
    750               Any white space in the name is converted to 
    751               underscores (_).  Ex. 'Tuner 0' => 'Tuner_0' 
    752  
    753          %c - channel or "freq-#" frequency 
    754  
    755   --date-format FORMAT: format string that specifies the 
    756        date format string to generate and substitute for 
    757        %d in the --directory-format string. 
    758  
    759        Available tokens:  see the date commands man page. 
    760          The string must start with a + (plus). 
    761  
    762   -o/--output OUTPUT: name of file to create 
    763   -d/--input VIDEO_DEV: video device to capture from 
    764   -W/--width WIDTH: width of screen (720 for NTSC fullscreen) 
    765   -H/--height HEIGHT: height of screen (480 for NTSC fullscreen) 
    766   -s/--standard STANDARD: NTSC, PAL or SECAM - video standard to record in 
    767   -T/--type TYPE: mpeg or yuv output 
    768   -i/--inputnum INPUT#: 
    769        The index number of the input you want to use (0 -> n-1) 
    770   -I/--inputname INPUT NAME: The name of the input you want to use. 
    771   -f/--freqtable FREQUENCY MAP: Specify the frequency mapping to use. 
    772   -F/--frequency FREQUENCY: Specify the frequency to tune to. 
    773                 ex. 517250 = NTSC Cable 73 (SCiFi) 
    774   --tuner-num TUNERNUM: Specify the tuner to use. 
    775   --set-msp-matrix BOOL: 1 - set the msp matrix after Video Standard changes 
    776                          0 - never set the msp matrix 
    777                          Uses the --msp-input and --msp-output options. 
    778   --msp-sleep SLEEP: number of seconds the card needs before we can program 
    779                      the msp matrix. 
    780   --msp-input INPUT: Specify the input parameter to program the msp matrix. 
    781                      Valid values are from 1 - 8. 
    782   --msp-output OUTPUT: Specify the output parameter to program the msp matrix. 
    783                        Valid values are from 0 - 3. 
    784   -L/--list-freqtable: 
    785        list all available frequency mappings that Video::Frequencies knows 
    786   --list-channels: lists all channels and their frequencies for the 
    787        specified frequency table being used. 
    788   --list-inputs: lists all inputs the v4l2 driver reports. 
    789   --list-standards: lists all Video Standards the v4l2 driver supports. 
    790   -R/--noreset: Do not Reset anything that was changed 
    791       (standard, channel, resolution, etc.) 
    792   --no-record: Do not create any directories, capture data or reset the card 
    793               back to original settings.  This is the ptune.pl mode. 
    794   -h/--help: display this help 
    795   -v/--version: display the version of this program 
    796   --debug: turns on debug output 
    797  
    798   Codec related options: 
    799   -b/--bitrate BITRATE: Specify the Bitrate to capture at 
    800   -B/--peakbitrate PEAK_BITRATE: Specify the Peak Bitrate to capture at 
    801   --aspect ASPECT: Specify the aspect value 
    802   --audio-bitmask AUDIO-BITMASK:  Specify the audio bitmask value 
    803   --bframes BFRAMES: Specify the bframes value 
    804   --dnrmode DNRMODE: Specify the dnr_mode value 
    805   --dnrspatial DNRSPATIAL: Specify the dnr_spatial value 
    806   --dnrtemporal DNRTEMPORAL: Specify the dnr_temporal value 
    807   --dnrtype DNRTYPE: Specify the dnr_type value 
    808   --framerate FRAMERATE: Specify the framerate value 
    809   --framespergop FRAMESPERGOP: Specify the framespergop value 
    810   --gopclosure GOPCLOSURE: Specify the gop_closure value 
    811   --pulldown PULLDOWN: Specify the pulldown value 
    812   --streamtype STREAMTYPE: Specify the stream_type value 
    813  
    814   Config file related options: 
    815   -P/--profile PROFILE: Override defaults and command line values with the 
    816               config entries in the section labeled [PROFILE] from the 
    817               config file $settings{ConfigFileName}. 
    818               Examples: -P NTSC-DVD, -P PAL-DVD, --profile MY-SETTINGS 
    819  
    820               You can specify this option multiple times and each successive 
    821               profile will overlay the defaults and any previous profiles. 
    822               You will not be able to create/update a profile if you do 
    823               specify multiple profiles. 
    824   -S/--save: save the current values as the defaults in 
    825       $settings{ConfigFileName}. 
    826       If -P/--profile PROFILE is specified, then those values that exist in 
    827       the specified profile will be updated.  If the profile doesn't exist, 
    828       then it will be created, but will have all possible config items 
    829       defined in it.  It will be your responsibility to hand check the 
    830       config file and remove any config items you do not want set for 
    831       that profile. 
    832       Any options specified on the command line will override options 
    833       defined in the config file. 
    834  
    835 Notes: 
    836   If you specify both -i/--inputnum and -I/--inputname then 
    837       -i/--inputnum will take precedence. 
    838  
    839   If you specify both -c/--channel and -F/--frequency then 
    840       -F/--frequency will take precedence. 
    841  
    842   If you use a Profile, it has the ability to override all command line 
    843     arguments, so check your Profile first if things seem to be ignored. 
    844  
    845 Defaults: 
    846  --duration $settings{RecordDuration} --input $settings{VideoDevice} --width $settings{VideoWidth} --height $settings{VideoHeight} --standard $settings{VideoStandard} 
    847  --type $settings{VideoType} --directory $settings{OutputDirectory} --output $settings{OutputFileName} 
    848  --directory-format "$settings{DirectoryFormatString}" --date-format "$settings{DateTimeFormatString}" 
    849  --inputnum $settings{InputNum} --inputname '$settings{InputName}' --freqtable $settings{FrequencyTable} 
    850  --set-msp-matrix $settings{SetMSPMatrix} --msp-sleep $settings{MSPSleep} --msp-input $settings{MSPInput} --msp-output $settings{MSPOutput} 
    851  --bitrate $settings{Bitrate} --peakbitrate $settings{PeakBitrate} --aspect $settings{Aspect} --audio-bitmask $settings{AudioBitmask} --bframes $settings{BFrames} 
    852  --dnrmode $settings{DNRMode} --dnrspatial $settings{DNRSpatial} --dnrtemporal $settings{DNRTemporal} --dnrtype $settings{DNRType} 
    853  --framerate $settings{Framerate} --framespergop $settings{FramesPerGOP} --gopclosure $settings{GOPClosure} --pulldown $settings{Pulldown} --streamtype $settings{StreamType} 
    854  --tuner-num $settings{TunerNum} 
    855  
    856  config file = '$settings{ConfigFileName}' 
    857  
    858  If Channel = $settings{Channel}, this would create: 
    859  $tmpDirectoryStr$settings{OutputFileName} 
    860  
    861  Note:  This script relies on Perl Modules: Video::Frequencies, Video::ivtv, 
    862  Config::IniFiles and Getopt::Long. 
    863 END_OF_USAGE 
    864  
    865 # handle user input here 
    866 my %opts; 
    867 #getopts('c:t:o:hd:W:H:s:T:D:vi:I:f:F:LRb:B:P:S', \%opts); 
    868 GetOptions(\%opts, "channel|c=s", "duration|t=i", "output|o=s", "help|h", "input|d=s", "width|W=i", "height|H=i", "standard|s=s", 
    869                    "type|T=s", "directory|D=s", "version|v", "inputnum|i=i", "inputname|I=s", "freqtable|f=s", "frequency|F=i", "list-freqtable|L", 
    870                    "noreset|R", "bitrate|b=i", "peakbitrate|B=i", "profile|P=s@", "save|S", "aspect=i", "audio-bitmask=s", "bframes=i", "dnrmode=i", "dnrspatial=i", 
    871                    "dnrtemporal=i", "dnrtype=i", "framerate=i", "framespergop=i", "gopclosure=i", "pulldown=i", 
    872                    "streamtype=i", "no-record", "directory-format=s", "date-format=s", "debug", "list-channels", 
    873                    "tuner-num=i", "list-inputs", "list-standards", "set-msp-matrix=i", "msp-input=i", "msp-output=i", "outputmpgfilename=s"); 
    874 if (scalar keys %opts == 0 && @ARGV == 0) 
    875 
    876   usage(0, ""); 
    877 
    878 foreach my $option (sort keys %opts) 
    879 
    880   my $found = 0; 
    881   foreach my $mapName (keys %mappings) 
    882   { 
    883     if ($option =~ /^($mappings{$mapName})$/) 
    884     { 
    885       $settings{$mapName} = $opts{$option}; 
    886       $found = 1; 
    887       print "$mapName = '$opts{$option}'\n" if $settings{Debug}; 
    888     } 
    889   } 
    890   if (!$found) 
    891   { 
    892     # handle the non-settings cases. 
    893     if ($option =~ /^(L|list-freqtable)$/) 
    894     { 
    895       my $errStr = "\nAvailable Frequency Mappings:\n"; 
    896       foreach my $name (sort keys %CHANLIST) 
    897       { 
    898         $errStr .= "$name\n"; 
    899       } 
    900       print "$versionStr\n$errStr"; 
    901       exit 0; 
    902     } 
    903     elsif ($option eq "list-channels") 
    904     { 
    905       my $errStr = "\nAvailable Channels for $settings{FrequencyTable}:\n"; 
    906       foreach my $name (sort { $a <=> $b } keys %{$CHANLIST{$settings{FrequencyTable}}}) 
    907       { 
    908         $errStr .= "$name\t= $CHANLIST{$settings{FrequencyTable}}->{$name}\n"; 
    909       } 
    910       print "$versionStr\n$errStr"; 
    911       exit 0; 
    912     } 
    913     elsif ($option =~ /^(no-record)$/) 
    914     { 
    915       $settings{DontRecord} = 1; 
    916     } 
    917     elsif ($option =~ /^(S|save)$/) 
    918     { 
    919       $settings{UpdateConfigFile} = 1; 
    920     } 
    921     elsif ($option =~ /^(P|profile)$/) 
    922     { 
    923       @profileNames = @{$opts{$option}}; 
    924     } 
    925     elsif ($option =~ /^(v|version)$/) 
    926     { 
    927       print "$versionStr\n"; 
    928       exit 0; 
    929     } 
    930     elsif ($option =~ /^(h|help)$/) 
    931     { 
    932       usage(0, ""); 
    933     } 
    934     elsif ($option =~ /^(list-inputs|list-standards)$/) 
    935     { 
    936       # do nothing for now since they will be handled later. 
    937     } 
    938  
    939     else 
    940     { 
    941       usage(1, "-$option is an unknown option!"); 
    942     } 
    943   } 
    944 
    945  
    946 if (@profileNames) 
    947 
    948   # loop over all profiles the user specified. 
    949   foreach my $profileName (@profileNames) 
    950   { 
    951     print "profile = '$profileName'\n" if $settings{Debug}; 
    952     # for now the profile can not be "defaults". 
    953     if ($profileName eq "defaults") 
    954     { 
    955       error(1, "Profile = '$profileName' is invalid!"); 
    956     } 
    957     if (exists $configIni{$profileName}) 
    958     { 
    959       # update defaults/override command line arguments that exist in this profile. 
    960       my $profileUpdating = (((exists $opts{S} || exists $opts{save}) && @profileNames == 1) ? 1 : 0); 
    961       my $profile = $profileName; 
    962  
    963       foreach my $arg (keys %mappings) 
    964       { 
    965         foreach my $option (split(/\|/, $mappings{$arg})) # handle the long/short command option versions 
    966         { 
    967           #print "arg = '$arg', option = '$option'\n" if $settings{Debug}; 
    968           if (exists $configIni{$profile}{$arg} && !($profileUpdating && exists $opts{$option})) 
    969           { 
    970             $settings{$arg} = $configIni{$profile}{$arg}; 
    971             print "settings{$arg} = '" . $settings{$arg} . "'\n" if $settings{Debug}; 
    972             last; 
    973           } 
    974         } 
    975       } 
    976     } 
    977     else 
    978     { 
    979       if ($settings{UpdateConfigFile} && @profileNames == 1) 
    980       { 
    981         print "Warning:  Profile = '$profileName' will be created.\n" if ($settings{Debug}); 
    982       } 
    983       else 
    984       { 
    985         error(1, "Profile = '$profileName' does not exist! You must specify -S/--save to create it."); 
    986       } 
    987     } 
    988   } 
    989 
    990  
    991 # verify input 
    992  
    993 if (@ARGV) 
    994 
    995   if (exists $opts{c} || exists $opts{channel}) 
    996   { 
    997     print "Warning: ignoring channel argument and using '$ARGV[0]' instead.\n"; 
    998   } 
    999   $settings{Channel} = $ARGV[0]; 
    1000 
    1001  
    1002 if (!$settings{DontRecord}) 
    1003 
    1004   print "RecordDuration = $settings{RecordDuration}\n" if $settings{Debug}; 
    1005  
    1006   if ($settings{VideoType} !~ /^(mpeg|yuv)$/) 
    1007   { 
    1008     error(1, "Video Type = '$settings{VideoType}' is invalid!"); 
    1009   } 
    1010   if ($settings{VideoType} eq "yuv") 
    1011   { 
    1012     # see if we need to change our defaults. 
    1013     if (!exists $opts{o} && !exists $opts{output}) 
    1014     { 
    1015       $settings{OutputFileName} = "video.yuv"; 
    1016     } 
    1017     if (!exists $opts{d} && !exists $opts{input}) 
    1018     { 
    1019       if ( -e "/dev/.devfsd" ) 
    1020       { 
    1021         $settings{VideoDevice} = "/dev/v4l/yuv0"; 
    1022       } 
    1023       else 
    1024       { 
    1025         $settings{VideoDevice} = "/dev/yuv0"; 
    1026       } 
    1027     } 
    1028   } 
    1029 
    1030  
    1031 if ( ! -c "$settings{VideoDevice}") 
    1032 
    1033   error(1, "Video Dev = '$settings{VideoDevice}' is invalid!  $!"); 
    1034 
    1035  
    1036 # now that the video device has been semi validated, we can use it to lookup 
    1037 # the inputs, standards, etc. and use that for validating some of the following 
    1038 # pieces of user input. 
    1039 sysopen($tuner, $settings{VideoDevice}, O_RDWR) or die "Error unable to open '$settings{VideoDevice}': $!"; 
    1040 my $tunerFD = fileno($tuner); 
    1041  
    1042 # get the current capabilities. 
    1043 @capabilities = $ivtvObj->getCapabilities($tunerFD); 
    1044 if (@capabilities != keys %{$ivtvObj->{capIndexes}}) 
    1045 
    1046   error(1, "getCapabilities() failed!"); 
    1047 
    1048 if ($capabilities[$ivtvObj->{capIndexes}{driver}] ne "ivtv") 
    1049 
    1050   $settings{UsingIvtvDriver} = 0;  # we can't use the ivtv "enhancements". 
    1051   print "Warning:  V4l2 driver = '$capabilities[$ivtvObj->{capIndexes}{driver}]' does not support the ivtv \"enhancements\"!\n"; 
    1052   print "          All codec related options will be ignored.\n\n"; 
    1053 
    1054  
    1055 my $i; 
    1056  
    1057 # get the current video standard 
    1058 $std = $ivtvObj->getStandard($tunerFD); 
    1059 if ($std > 0) 
    1060 
    1061   printf("Standard: 0x%08x\n",$std) if ($settings{Debug}); 
    1062 
    1063 else 
    1064 
    1065   die "Error: getStandard() failed!\n"; 
    1066 
    1067  
    1068 # get the current input 
    1069 $curinput = $ivtvObj->getInput($tunerFD); 
    1070 if ($curinput < 0) 
    1071 
    1072   die "Error: getInput() failed!\n"; 
    1073 
    1074 printf("Input: 0x%08x\n",$curinput) if ($settings{Debug}); 
    1075  
    1076 my $done=0; 
    1077 # Standards 
    1078 for ($i=0; !$done; ++$i) 
    1079 
    1080   my($index,$std_id,$name,$frameperiod_n,$frameperiod_d,$framelines) = $ivtvObj->enumerateStandard($tunerFD, $i); 
    1081   if ($index == -1) 
    1082   { 
    1083     $done = 1; 
    1084   } 
    1085   else 
    1086   { 
    1087     printf("%d 0x%08x %s %d/%d %d\n",$index,$std_id,$name,$frameperiod_n,$frameperiod_d,$framelines) if ($settings{Debug}); 
    1088     push @standards, [($name,$std_id)]; 
    1089     $name2std{$name} = $std_id; 
    1090     if( (($std_id & $std) == $std)) 
    1091     { 
    1092       $curstd = $name; 
    1093       $curStandard = $std; 
    1094     } 
    1095   } 
    1096 
    1097  
    1098 if (exists $opts{'list-standards'}) 
    1099 
    1100   print "$versionStr\n"; 
    1101   print "Available Video Standards:\n"; 
    1102   foreach my $standard (@standards) 
    1103   { 
    1104     print "$standard->[0]\n"; 
    1105   } 
    1106   exit 0; 
    1107 
    1108  
    1109 $done=0; 
    1110 # Inputs 
    1111 for ($i=0; !$done; ++$i) 
    1112 
    1113   my($index,$name,$type,$audioset,$tuner,$std,$status) = $ivtvObj->enumerateInput($tunerFD, $i); 
    1114   if ($index == -1) 
    1115   { 
    1116     $done = 1; 
    1117   } 
    1118   else 
    1119   { 
    1120     push @inputs, $name; 
    1121     $name2input{$name} = $index; 
    1122   } 
    1123 
    1124 $curinputName = $inputs[$curinput]; 
    1125  
    1126 if (exists $opts{'list-inputs'}) 
    1127 
    1128   print "$versionStr\n"; 
    1129   print "Available Inputs:\n"; 
    1130   my $counter = 0; 
    1131   foreach my $input (@inputs) 
    1132   { 
    1133     print "$counter: $input\n"; 
    1134     $counter++; 
    1135   } 
    1136   exit 0; 
    1137 
    1138  
    1139 if ($settings{UsingIvtvDriver}) 
    1140 
    1141   # get the current Codec Info 
    1142   @codecInfo = $ivtvObj->getCodecInfo($tunerFD); 
    1143   if (@codecInfo != keys %{$ivtvObj->{codecIndexes}}) 
    1144   { 
    1145     error(1, "getCodecInfo() failed!"); 
    1146   } 
    1147   @newCodecInfo = $ivtvObj->getCodecInfo($tunerFD); 
    1148   if (@newCodecInfo != keys %{$ivtvObj->{codecIndexes}}) 
    1149   { 
    1150     error(1, "getCodecInfo() failed!"); 
    1151   } 
    1152 
    1153  
    1154 # finish validating the user input. 
    1155  
    1156 if (!$settings{DontRecord}) 
    1157 
    1158   if ($settings{RecordDuration} !~ /^(\d+)$/) 
    1159   { 
    1160     error(1, "Time = '$settings{RecordDuration}' is invalid!"); 
    1161   } 
    1162  
    1163   if ( ! -d "$settings{OutputDirectory}") 
    1164   { 
    1165     error(1, "Directory = '$settings{OutputDirectory}' is invalid!  $!"); 
    1166   } 
    1167  
    1168   # assume for now we are only generating mpeg files. 
    1169 #  if (($settings{VideoType} eq "mpeg" && $settings{OutputFileName} !~ /^.+\.mpg$/) || ($settings{VideoType} eq "yuv" && $settings{OutputFileName} !~ /^.+\.yuv$/)) 
    1170 #  { 
    1171 #    error(1, "Output = '$settings{OutputFileName}' is invalid!"); 
    1172 #  } 
    1173 
    1174   if ($settings{DateTimeFormatString} !~ /^(\+((\%.)|.)+)$/) 
    1175   { 
    1176     usage(1, "Date Format String = '$settings{DateTimeFormatString}' is invalid!"); 
    1177   } 
    1178 
    1179  
    1180 if ($settings{VideoWidth} !~ /^(\d+)$/) 
    1181 
    1182   error(1, "Width = '$settings{VideoWidth}' is invalid!"); 
    1183 
    1184  
    1185 if ($settings{VideoHeight} !~ /^(\d+)$/) 
    1186 
    1187   error(1, "Height = '$settings{VideoHeight}' is invalid!"); 
    1188 
    1189  
    1190 if (!exists $name2std{$settings{VideoStandard}}) 
    1191 
    1192   my $validStandards = join(", ", keys(%name2std)); 
    1193   error(1, "Video Standard = '$settings{VideoStandard}' is invalid!\nValid Standards are: $validStandards"); 
    1194 
    1195  
    1196 if (exists $opts{i} || exists $opts{inputnum}) 
    1197 
    1198   if ($settings{InputNum} < 0 || $settings{InputNum} >= scalar(@inputs)) 
    1199   { 
    1200     error(1, "Video Input = '$settings{InputNum}' is invalid!\nValid Inputs are from 0 - " . int(scalar(@inputs) - 1)); 
    1201   } 
    1202   $settings{InputName} = $inputs[$settings{InputNum}]; 
    1203 
    1204  
    1205 if ((exists $opts{I} || exists $opts{inputname}) && !(exists $opts{i} || exists $opts{inputnum})) 
    1206 
    1207   if (!exists $name2input{$settings{InputName}}) 
    1208   { 
    1209     my $validInputs = join(", ", @inputs); 
    1210     error(1, "Video Input Name = '$settings{InputName}' is invalid!\nValid Input Names are: $validInputs"); 
    1211   } 
    1212   $settings{InputNum} = $name2input{$settings{InputName}}; 
    1213 
    1214  
    1215 if (!exists $CHANLIST{$settings{FrequencyTable}}) 
    1216 
    1217   error(1, "Frequency Table = '$settings{FrequencyTable}' is invalid!"); 
    1218 
    1219  
    1220 # only validate the channel if the input is a tuner. 
    1221 if ($inputs[$settings{InputNum}] =~ /Tuner/) 
    1222 
    1223   if ($settings{TunerNum} !~ /^(\d)$/) 
    1224   { 
    1225     error(1, "TunerNum = '$settings{TunerNum}' is invalid!"); 
    1226   } 
    1227   if (exists $opts{F} || exists $opts{frequency} || $settings{Frequency}) # the user may have specified a Frequency in their config file 
    1228   { 
    1229     if ($settings{Frequency} !~ /^(\d+)$/) 
    1230     { 
    1231       error(1, "Frequency = '$settings{Frequency}' is invalid!"); 
    1232     } 
    1233     $settings{Channel} = "freq-$settings{Frequency}";  # make sure we output the channel part. 
    1234   } 
    1235   # now verify that the channel exists in the frequency table! 
    1236   else 
    1237   { 
    1238     if (!$settings{Channel}) 
    1239     { 
    1240       error(1, "channel = '$settings{Channel}' is invalid!"); 
    1241     } 
    1242     # first verify the freqency table is appropriate for the standard (NTSC, PAL, SECAM), 
    1243     # unless they specified the frequency to tune to. 
    1244     if ($settings{FrequencyTable} !~ /^(custom|$settings{VideoStandard})/i) 
    1245     { 
    1246       error(1, "You specified Video Standard '$settings{VideoStandard}' which is incompatible with Frequency Table '$settings{FrequencyTable}'!"); 
    1247     } 
    1248     if (!exists $CHANLIST{$settings{FrequencyTable}}->{$settings{Channel}}) 
    1249     { 
    1250       error(1, "Channel = '$settings{Channel}' does not exist in Frequency Table '$settings{FrequencyTable}'!"); 
    1251     } 
    1252   } 
    1253  
    1254   # get the current channel/frequency value. 
    1255   my $Frequency; 
    1256   if(($Frequency = $ivtvObj->getFrequency($tunerFD, $settings{TunerNum})) >= 0) 
    1257   { 
    1258     my $freq = ($Frequency * 1000) / 16; 
    1259     print "freq = $freq\n" if ($settings{Debug}); 
    1260     # find the associated channel. 
    1261     if ((!exists $opts{F} && !exists $opts{frequency} && !$settings{Frequency}) && ($curstd eq $settings{VideoStandard}) ) 
    1262     { 
    1263       foreach my $chan (keys %{$CHANLIST{$settings{FrequencyTable}}}) 
    1264       { 
    1265         if ($CHANLIST{$settings{FrequencyTable}}->{$chan} == $freq) 
    1266         { 
    1267           $curChannel = $chan; 
    1268         } 
    1269       } 
    1270       print "curChannel = $curChannel\n" if ($settings{Debug}); 
    1271     } 
    1272     else 
    1273     { 
    1274       $curFrequency = $freq; 
    1275     } 
    1276   } 
    1277   else 
    1278   { 
    1279     die "Error: getFrequency() failed!\n"; 
    1280   } 
    1281 
    1282 else 
    1283 
    1284   # set the channel = "" so we know to ignore it. 
    1285   $settings{Channel} = ""; 
    1286 
    1287  
    1288 if ($settings{UsingIvtvDriver}) 
    1289 
    1290   # validate the Codec related stuff. 
    1291   if ($settings{Bitrate} < $settings{minBitrate} || $settings{Bitrate} > $settings{maxBitrate}) 
    1292   { 
    1293     error(1, "Bitrate = '$settings{Bitrate}' is invalid!"); 
    1294   } 
    1295   if ($settings{PeakBitrate} <= $settings{Bitrate}) 
    1296   { 
    1297     error(1, "PeakBitrate can not be less than or equal to Bitrate!"); 
    1298   } 
    1299   elsif ($settings{PeakBitrate} < $settings{minPeakBitrate} || $settings{PeakBitrate} > $settings{maxPeakBitrate}) 
    1300   { 
    1301     error(1, "PeakBitrate = '$settings{PeakBitrate}' is invalid!"); 
    1302   } 
    1303  
    1304   if ($settings{VideoStandard} !~ /^(NTSC)/) 
    1305   { 
    1306     my $warn = 0; 
    1307     if ($settings{Framerate} == 0) 
    1308     { 
    1309       $settings{Framerate} = 1; 
    1310       $warn = 1; 
    1311     } 
    1312     if ($settings{FramesPerGOP} == 15) 
    1313     { 
    1314       $settings{FramesPerGOP} = 12; 
    1315       $warn = 1; 
    1316     } 
    1317     if ($warn) 
    1318     { 
    1319       print "Warning:  Setting Framerate/FramesPerGOP to PAL settings for Video Standard '$settings{VideoStandard}'!\n\nYou should either specify on the command line or in the ~/.ivtvrc config file.\n"; 
    1320     } 
    1321   } 
    1322   elsif ($settings{VideoStandard} =~ /^(NTSC)/) 
    1323   { 
    1324     my $warn = 0; 
    1325     if ($settings{Framerate} == 1) 
    1326     { 
    1327       $settings{Framerate} = 0; 
    1328       $warn = 1; 
    1329     } 
    1330     if ($settings{FramesPerGOP} == 12) 
    1331     { 
    1332       $settings{FramesPerGOP} = 15; 
    1333       $warn = 1; 
    1334     } 
    1335     if ($warn) 
    1336     { 
    1337       print "Warning:  Setting Framerate/FramesPerGOP to NTSC settings for Video Standard '$settings{VideoStandard}'!\n\nYou should either specify on the command line or in the ~/.ivtvrc config file.\n"; 
    1338     } 
    1339   } 
    1340  
    1341   if ($settings{SetMSPMatrix} !~ /^(0|1)$/) 
    1342   { 
    1343     error(1, "SetMSPMatrix = '$settings{SetMSPMatrix}' is invalid!  It can only be 0 or 1."); 
    1344   } 
    1345   if ($settings{MSPInput} < 1 || $settings{MSPInput} > 8) 
    1346   { 
    1347     error(1, "MSPInput = '$settings{MSPInput}' is invalid!  It can only be 1 - 8."); 
    1348   } 
    1349   if ($settings{MSPOutput} < 0 || $settings{MSPOutput} > 3) 
    1350   { 
    1351     error(1, "MSPOutput = '$settings{MSPOutput}' is invalid!  It can only be 0 - 3."); 
    1352   } 
    1353 
    1354  
    1355 # update the config file if the user wants us to. 
    1356 if ($settings{UpdateConfigFile}) 
    1357 
    1358   my $profile; 
    1359   if (@profileNames > 1) 
    1360   { 
    1361     print "Warning:  Not updating config file as you have more than 1 profile specified!\n"; 
    1362   } 
    1363   elsif (@profileNames == 1) 
    1364   { 
    1365     $profile = $profileNames[0]; 
    1366   } 
    1367   else 
    1368   { 
    1369     $profile = "defaults"; 
    1370   } 
    1371   if ($profile) 
    1372   { 
    1373     my $createProfile = (exists $configIni{$profile} ? 0 : 1); 
    1374     print "Creating Profile = '$profile': $createProfile\n" if ($settings{Debug}); 
    1375  
    1376     if (!$settings{UseConfigFile}) 
    1377     { 
    1378       # we have to create the config file and tie to it. 
    1379       tie %configIni, 'Config::IniFiles', () or die "Error: Initializing config file '$settings{ConfigFileName}' failed! $!\n"; 
    1380  
    1381       # now set the name to work with. 
    1382       tied(%configIni)->SetFileName($settings{ConfigFileName}) or die "Error: Setting config file to '$settings{ConfigFileName}' failed! $!\n"; 
    1383  
    1384       $configIni{$profile} = {};  # make sure the section exists. 
    1385     } 
    1386  
    1387     foreach my $arg (keys %mappings) 
    1388     { 
    1389       foreach my $option (split(/\|/, $mappings{$arg})) # handle the long/short command option versions 
    1390       { 
    1391         if (exists $configIni{$profile}{$arg} || $createProfile || exists $opts{$option}) 
    1392         { 
    1393           $configIni{$profile}{$arg} = $settings{$arg}; 
    1394           print "configIni{$profile}{$arg} = '" . $settings{$arg} . "'\n" if $settings{Debug}; 
    1395           last; 
    1396         } 
    1397       } 
    1398     } 
    1399  
    1400     # write the config file out. 
    1401     tied(%configIni)->RewriteConfig or die "Error: Writing config file '$settings{ConfigFileName}' failed!  $!\n"; 
    1402   } 
    1403 
    1404  
    1405 # this hash keeps track of those values I have to set back. 
    1406 my %changedSettings = ( 
    1407     resolution => 0, 
    1408     standard => 0, 
    1409     VideoType => 0, 
    1410     InputNum => 0, 
    1411     Channel => 0, 
    1412     Frequency => 0, 
    1413     codec => 0, 
    1414     ); 
    1415  
    1416 my $directoryName; 
    1417 if (!$settings{DontRecord}) 
    1418 
    1419   # make directory 
    1420   #$directoryName = formatDirectoryString(); 
    1421   #$result=`mkdir -p $directoryName`; 
    1422         $directoryName = $settings{DirectoryFormatString}; 
    1423 
    1424  
    1425 # change the channel 
    1426 if ($inputs[$settings{InputNum}] =~ /Tuner/) 
    1427 
    1428   if (exists $opts{F} || exists $opts{frequency} || $settings{Frequency}) 
    1429   { 
    1430     if ($settings{Frequency} != $curFrequency) 
    1431     { 
    1432       $changedSettings{Frequency} = 1; 
    1433       tuneFrequency($settings{Frequency}); 
    1434     } 
    1435   } 
    1436   else 
    1437   { 
    1438     if ($curstd ne $settings{VideoStandard}) 
    1439     { 
    1440       # we have to set the channel regardless. 
    1441       # but we want to tune back to the previous frequency. 
    1442       $changedSettings{Frequency} = 1; 
    1443       changeChannel($settings{Channel}); 
    1444     } 
    1445     elsif ($settings{Channel} ne $curChannel) 
    1446     { 
    1447       # otherwise we just changeChannel and restore the previous channel. 
    1448       $changedSettings{Channel} = 1; 
    1449       changeChannel($settings{Channel}); 
    1450     } 
    1451   } 
    1452 
    1453  
    1454 # set the video standard 
    1455 if ($settings{VideoStandard} ne $curstd) 
    1456 
    1457   $changedSettings{standard} = 1; 
    1458   change_standard(); 
    1459  
    1460   # see if we have to re-program the msp matrix 
    1461   if ($settings{UsingIvtvDriver}) 
    1462   { 
    1463     if ($settings{SetMSPMatrix}) 
    1464     { 
    1465       print "Setting msp matrix: input = $settings{MSPInput}, output = $settings{MSPOutput}\n" if $settings{Debug}; 
    1466       sleep ($settings{MSPSleep});  # sleep for 2 seconds to let card settle down. 
    1467       $result = $ivtvObj->mspMatrixSet($tunerFD, $settings{MSPInput}, $settings{MSPOutput}); 
    1468       if (not defined $result) 
    1469       { 
    1470         die "Error calling mspMatrixSet!\n"; 
    1471       } 
    1472       if (!$result) 
    1473       { 
    1474         die "Error in mspMatrixSet ioctl call!\n"; 
    1475       } 
    1476     } 
    1477   } 
    1478 
    1479  
    1480 # set the input 
    1481 if ($settings{InputNum} != $curinput || $settings{InputName} ne $curinputName) 
    1482 
    1483   $changedSettings{InputNum} = 1; 
    1484   if (!(exists $opts{i} || exists $opts{inputnum} || exists $opts{I} || exists $opts{inputname}))  # our defaults are different than the current values! 
    1485   { 
    1486    ## print "Warning:  Changing input from $curinputName to $settings{InputName}\n"; 
    1487    &writelog("tvrecording:  Changing input from $curinputName to $settings{InputName}"); 
    1488   } 
    1489   change_input(); 
    1490 
    1491  
    1492 # set the capture type 
    1493  
    1494 # store the current width,height so we can restore afterwards 
    1495 my ($oldWidth, $oldHeight) = $ivtvObj->getResolution($tunerFD); 
    1496 print "oldWidth = '$oldWidth', oldHeight = '$oldHeight'\n" if ($settings{Debug}); 
    1497  
    1498 if ($settings{VideoWidth} != $oldWidth || $settings{VideoHeight} != $oldHeight) 
    1499 
    1500   $changedSettings{resolution} = 1; 
    1501 
    1502  
    1503 # specify the width,height to capture 
    1504 if ($changedSettings{resolution}) 
    1505 
    1506   $result = $ivtvObj->setResolution($tunerFD, $settings{VideoWidth}, $settings{VideoHeight}); 
    1507   if (not defined $result) 
    1508   { 
    1509     die "Error calling setResolution!\n"; 
    1510   } 
    1511   if (!$result) 
    1512   { 
    1513     die "Error in setResolution ioctl call!\n"; 
    1514   } 
    1515 
    1516  
    1517 if ($settings{UsingIvtvDriver}) 
    1518 
    1519   # specify the codec options to capture mpeg's at. 
    1520   foreach my $codecName (keys %codecMappings) 
    1521   { 
    1522     my $codecIndex = $ivtvObj->{codecIndexes}{$codecMappings{$codecName}}; 
    1523     if ($codecInfo[$codecIndex] != $settings{$codecName}) 
    1524     { 
    1525       $changedSettings{codec} = 1; 
    1526       $newCodecInfo[$codecIndex] = $settings{$codecName}; 
    1527       print "new $codecName = '$settings{$codecName}', old $codecName = '$codecInfo[$codecIndex]'\n" if $settings{Debug}; 
    1528     } 
    1529   } 
    1530 
    1531  
    1532 if ($changedSettings{codec}) 
    1533 
    1534   $result = $ivtvObj->setCodecInfo($tunerFD, @newCodecInfo); 
    1535   if (!$result) 
    1536   { 
    1537     die "Error calling setCodecInfo()!\n"; 
    1538   } 
    1539 
    1540  
    1541 if (!$settings{DontRecord}) 
    1542 
    1543   # capture the video/audio to video.mpg 
    1544   #print "directoryName:$directoryName, RecordDuration:$settings{RecordDuration},OutputFileName:$settings{OutputFileName}:tuner:$tuner ,OutputMPGFileName:$settings{OutputMPGFileName}  \n"; 
    1545   #directoryName:, RecordDuration:60,OutputFileName:/tv/JOAX-20040615-1411-000.MPG:tuner:GLOB(0x8224838) ,OutputMPGFileName:   
    1546   captureVideo(directoryName => $directoryName, RecordDuration => $settings{RecordDuration}, 
    1547               OutputFileName => $settings{OutputFileName}, tuner => $tuner ,OutputMPGFileName => $settings{OutputMPGFileName}); 
    1548 
    1549  
    1550 if ($settings{ResetCardSettings} && !$settings{DontRecord}) 
    1551 
    1552   # restore Codec values 
    1553   if ($changedSettings{codec}) 
    1554   { 
    1555     $result = $ivtvObj->setCodecInfo($tunerFD, @codecInfo); 
    1556     if (!$result) 
    1557     { 
    1558       die "Error calling setCodecInfo()!\n"; 
    1559     } 
    1560   } 
    1561  
    1562   # restore the previous width,height settings 
    1563   if ($changedSettings{resolution}) 
    1564   { 
    1565     $result = $ivtvObj->setResolution($tunerFD, $oldWidth, $oldHeight); 
    1566     if (not defined $result) 
    1567     { 
    1568       die "Error calling setResolution!\n"; 
    1569     } 
    1570     if (!$result) 
    1571     { 
    1572       die "Error in setResolution ioctl call!\n"; 
    1573     } 
    1574   } 
    1575  
    1576   # restore the previous input setting 
    1577   if ($changedSettings{InputNum}) 
    1578   { 
    1579     # reset back to the old input name 
    1580     $settings{InputName} = $curinputName; 
    1581     change_input(); 
    1582   } 
    1583  
    1584   # restore the previous video standard 
    1585   if ($changedSettings{standard}) 
    1586   { 
    1587     $settings{VideoStandard} = $curstd; 
    1588     change_standard(); 
    1589  
    1590     # see if we have to re-program the msp matrix 
    1591     if ($settings{UsingIvtvDriver}) 
    1592     { 
    1593       if ($settings{SetMSPMatrix}) 
    1594       { 
    1595         print "Setting msp matrix: input = $settings{MSPInput}, output = $settings{MSPOutput}\n" if $settings{Debug}; 
    1596         sleep ($settings{MSPSleep});  # sleep for 2 seconds to let card settle down. 
    1597         $result = $ivtvObj->mspMatrixSet($tunerFD, $settings{MSPInput}, $settings{MSPOutput}); 
    1598         if (not defined $result) 
    1599         { 
    1600           die "Error calling mspMatrixSet!\n"; 
    1601         } 
    1602         if (!$result) 
    1603         { 
    1604           die "Error in mspMatrixSet ioctl call!\n"; 
    1605         } 
    1606       } 
    1607     } 
    1608   } 
    1609  
    1610   # restore the previous channel 
    1611   if ($changedSettings{Channel}) 
    1612   { 
    1613     changeChannel($curChannel); 
    1614   } 
    1615   if ($changedSettings{Frequency}) 
    1616   { 
    1617     tuneFrequency($curFrequency); 
    1618   } 
    1619 
    1620  
    1621 # close the tuner device 
    1622 close($tuner); 
    1623  
    1624  
    1625 exit 0; 
    1626  
    1627 # usage(returnValue, ErrorString) 
    1628 # returnValue = 1 or 0 
    1629 # ErrorString = message you want to tell the user, but only if returnValue = 1. 
    1630 sub usage 
    1631 
    1632   my $errorCode = shift; 
    1633   my $error = shift; 
    1634  
    1635   print $usageStr; 
    1636   print "\nError:  $error\n" if ($errorCode == 1); 
    1637   print "$error\n" if ($errorCode == 2); 
    1638  
    1639   exit $errorCode; 
    1640 
    1641  
    1642 # error(returnValue, ErrorString) 
    1643 # returnValue = 1 or 0 
    1644 # ErrorString = message you want to tell the user. 
    1645 sub error 
    1646 
    1647   my $errorCode = shift; 
    1648   my $error = shift; 
    1649  
    1650   print "$versionStr"; 
    1651   print "\nError:  $error\n"; 
    1652  
    1653   exit $errorCode; 
    1654 
    1655  
    1656 # changes the input to $settings{InputNum} as long as it isn't = $curinput 
    1657 sub change_input { 
    1658   my $preinput = $name2input{$settings{InputName}}; 
    1659   if($preinput != $curinput) 
    1660   { 
    1661     $curinput = $preinput; 
    1662     print "input now $settings{InputName}, #$preinput\n" if ($settings{Debug}); 
    1663     my $result = $ivtvObj->setInput($tunerFD, $preinput); 
    1664     if (!$result) 
    1665     { 
    1666       die "Error:  setInput($preinput) failed!\n"; 
    1667     } 
    1668   } 
    1669 
    1670  
    1671 # changes the video standard to $settings{VideoStandard} as long as it isn't = $curstd 
    1672 sub change_standard { 
    1673   my $standard = $name2std{$settings{VideoStandard}}; 
    1674   if($standard != $curStandard) 
    1675   { 
    1676     $curStandard = $standard; 
    1677     print "standard now $settings{VideoStandard}, #$standard\n" if ($settings{Debug}); 
    1678     my $result = $ivtvObj->setStandard($tunerFD, $standard); 
    1679     if (!$result) 
    1680     { 
    1681       die "Error:  setStandard($standard) failed!\n"; 
    1682     } 
    1683   } 
    1684 
    1685  
    1686 # changes the channel 
    1687 # takes the channel to change 
    1688 sub changeChannel 
    1689 
    1690   my $ch = shift; 
    1691   my $freq = $CHANLIST{$settings{FrequencyTable}}->{$ch}; 
    1692   my $driverf = ($freq * 16)/1000; 
    1693  
    1694   print "Ch.$ch: $freq $driverf\n" if ($settings{Debug}); 
    1695  
    1696   if (!$ivtvObj->setFrequency($tunerFD, $settings{TunerNum}, $driverf)) 
    1697   { 
    1698     die "Error:  changeChannel($ch) failed!\n"; 
    1699   } 
    1700 
    1701  
    1702 # tunes to the specified frequency 
    1703 # takes the frequency to tune to 
    1704 sub tuneFrequency 
    1705 
    1706   my $freq = shift; 
    1707   my $driverf = ($freq * 16)/1000; 
    1708  
    1709   print "freq: $freq $driverf\n" if ($settings{Debug}); 
    1710  
    1711   if (!$ivtvObj->setFrequency($tunerFD, $settings{TunerNum}, $driverf)) 
    1712   { 
    1713     die "Error:  tuneFrequency($freq) failed!\n"; 
    1714   } 
    1715 
    1716  
    1717 my $done = 0; 
    1718  
    1719 sub catch_alarm { 
    1720   $done = 1; 
    1721 
    1722 sub get_next_file_name 
    1723 
    1724  
    1725   my $file_name = shift(@_); 
    1726   $file_name =~ m/^(.+?)\-(\d{4})(\d{2})(\d{2})\-(\d{2})(\d{2})\-(\d{3})\.(.+?)$/; 
    1727    
    1728   my $station = $1; 
    1729   my $year    = $2; 
    1730   my $month   = $3; 
    1731   my $day     = $4; 
    1732   my $hour    = $5; 
    1733   my $min     = $6; 
    1734   my $seq     = $7; 
    1735   my $ext     = $8; 
    1736   $seq++; 
    1737   my $new_file_name = sprintf("%s-%04d%02d%02d-%02d%02d-%03d.%s", 
    1738                             $station,$year,$month,$day,$hour,$min,$seq,$ext); 
    1739   return $new_file_name 
    1740 
    1741  
    1742 # does the actual video capturing work. 
    1743 # takes directoryName, RecordDuration, OutputFileName, tuner 
    1744 sub captureVideo 
    1745 
    1746   my %args = ( @_ ); 
    1747   my $directoryName = $args{directoryName}; 
    1748   my $RecordDuration = $args{RecordDuration}; 
    1749   my $OutputFileName = $args{OutputFileName}; 
    1750   my $tuner = $args{tuner}; 
    1751   my $fname = "$directoryName/$OutputFileName"; 
    1752 #    "OutputMPGFileName"   => "outputmpgfilename", 
    1753 #  my $OutputFileName = $args{OutputMPGFileName}; 
    1754   my $OutputFileName = $args{OutputFileName}; 
    1755 #  my $fname = "$directoryName/$OutputFileName"; 
    1756   my $fname = $args{OutputFileName}; 
    1757   
    1758  
    1759   # setup global variables, signal handlers, etc. 
    1760  
    1761   $SIG{ALRM} = \&catch_alarm; 
    1762   $SIG{INT}  = \&catch_alarm;  # handle Ctrl-C 
    1763  
    1764   # turn off file buffering. 
    1765   #$|=1; 
    1766  
    1767   # open the file for writing. 
    1768  
    1769  
    1770  
    1771   sysopen(OUTPUT, "$fname", O_CREAT | O_WRONLY | O_LARGEFILE) or die "Error creating file '$fname': $!\n"; 
    1772  
    1773   alarm($RecordDuration); 
    1774   my $buf = ""; 
    1775   my $len = 0; 
    1776   while (!$done && read($tuner, $buf, 16384)) 
    1777   { 
    1778     $len += length($buf); 
    1779 #    if ($len >= $max_file_size ) 
    1780 #    { 
    1781 #       close(OUTPUT); 
    1782 #       $OutputFileName = get_next_file_name($OutputFileName); 
    1783 ##       $fname = "$directoryName/$OutputFileName"; 
    1784 #       $fname = "$OutputFileName"; 
    1785 #          &writelog("tvrecording switch next clip.$fname"); 
    1786 #       sysopen(OUTPUT, "$fname", O_CREAT | O_WRONLY | O_LARGEFILE)  
    1787 #                       or die "Error creating file '$fname': $!\n"; 
    1788 #       $len = 0; 
    1789 #    } 
    1790  
    1791     # read from the device and write to the file. 
    1792     print OUTPUT $buf; 
    1793   } 
    1794  
    1795   # close the file 
    1796   close(OUTPUT); 
    1797  
    1798   #$|=0;  # turn file buffering back on. 
    1799 
    1800  
    1801 # returns the formatted directory string 
    1802 sub formatDirectoryString 
    1803 
    1804   my $temp = $settings{DirectoryFormatString}; 
    1805   my $result = $settings{OutputDirectory}; 
    1806   my %lookupTable = ( 
    1807     "d" => `/bin/date "$settings{DateTimeFormatString}"`, 
    1808     "I" => $settings{InputName}, 
    1809     "c" => $settings{Channel}, 
    1810   ); 
    1811  
    1812   # fixup the InputName value 
    1813   $lookupTable{I} =~ s/\s/_/g; 
    1814   # cleanup the trailing slash on the date 
    1815   chomp $lookupTable{d}; 
    1816  
    1817   foreach my $option ("d", "I", "c") 
    1818   { 
    1819     $temp =~ s/\%$option/$lookupTable{$option}/g; 
    1820   } 
    1821  
    1822   $result .= "/" . ($temp ? "$temp/" : ""); 
    1823  
    1824   return $result; 
    1825 
    1826  
    1827  
    1828  
    1829  
    1830  
     344 
     345sub callrecordv4l{ 
     346 
     347#$frequency = `ivtv-tune -d $recdevice -t $frequencyTable -c $ivtvrecch | awk '{print $2}'|tr -d .`; 
     348my $ivtvtuneftype = ''; 
     349if ($frequencyTable eq "ntsc-cable-jp"){ 
     350        $ivtvtuneftype = 'japan-cable'; 
     351}else{ 
     352        $ivtvtuneftype = 'japan-bcast'; 
     353
     354#print "ivtv-tune -d $recdevice -t $ivtvtuneftype -c $ivtvrecch\n"; 
     355&writelog("tvrecording DEBUG ivtv-tune -d $recdevice -t $ivtvtuneftype -c $ivtvrecch"); 
     356&writelog("tvrecording DEBUG $ENV{PATH}"); 
     357 
     358$frequency = `env PATH=PATH=/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/bin:/home/foltia/bin ivtv-tune -d $recdevice -t $ivtvtuneftype -c $ivtvrecch`; 
     359&writelog("tvrecording DEBUG frequency:$frequency"); 
     360@frequency = split(/\s/,$frequency); 
     361$frequency[1] =~ s/\.//gi; 
     362$frequency = $frequency[1] ; 
     363&writelog("tvrecording DEBUG frequency:$frequency"); 
     364 
     365my $recordv4lcallstring = "$toolpath/perl/record-v4l2.pl --frequency $frequency --duration $reclengthsec --input $recdevice --directory $recfolderpath --inputnum $capturedeviceinputnum --inputname '$capturedeviceinputName' --freqtable $frequencyTable --bitrate $stdbitrate --peakbitrate $peakbitrate --output $outputfilewithoutpath "; 
     366 
     367&writelog("tvrecording $recordv4lcallstring"); 
     368&writelog("tvrecording DEBUG $ENV{HOME}/.ivtvrc"); 
     369$oserr = `env HOME=$toolpath $recordv4lcallstring`; 
     370&writelog("tvrecording DEBUG $oserr"); 
     371 
     372}#end callrecordv4l 
     373 
  • trunk/install/perl/updatem2pfiletable.pl

    r69 r83  
    3434        $sth->execute(); 
    3535 
    36 while ($file = glob("$recfolderpath/*.m2p")) { 
     36while ($file = glob("$recfolderpath/*.m2?")) { 
    3737$file =~ s/$recfolderpath\///; 
    3838$query =  "insert into  foltia_m2pfiles values ('$file')"; 
     
    5757$filetid = $fileline[0]; 
    5858$filetid =~ s/[^0-9]//g; 
    59  
    60 $query =  "insert into  foltia_mp4files values ('$filetid','$fileline[2]')"; 
    61 $oserr = $dbh->do($query); 
     59if (($filetid ne "" )&& ($fileline[2] ne "" )){ 
     60       $query =  "insert into  foltia_mp4files values ('$filetid','$fileline[2]')"; 
     61       $oserr = $dbh->do($query); 
    6262#print "$filetid;$fileline[2];$query\n" 
    6363# http://www.atmarkit.co.jp/fnetwork/rensai/sql03/sql1.html 
    64  
    65 } 
     64}#end if 
     65}# end foreach 
    6666$oserr = $dbh->commit; 
    6767 
  • trunk/install/php/foltia_config2.php.template

    r70 r83  
    1717                $recfolderpath = '/home/foltia/php/tv'; //録画ファイルの保存先のパス。 
    1818                $httpmediamappath = '/tv'; //ブラウザから見える録画ファイルのある位置。 
    19                 $recunits = '4';                                        //搭載エンコーダの数 
     19                $recunits = '4';                                        //搭載アナログキャプチャカードチャンネル数 
    2020 
    2121                $protectmode = 0; //未使用:(ブラウザからの予約削除を禁止するなどの保護モードで動作します) 
     
    2424                $environmentpolicytoken = "";//環境ポリシーのパスワードに連結されるセキュリティコード 
    2525                $perltoolpath = $toolpath ;//perl版の初期設定の位置。デフォルトではphpと同じ位置 
     26                $usedigital = 1;//Friioなどでデジタル録画をするか 1:する 0:しない 
    2627 
    2728// データベース接続設定 
  • trunk/install/php/index.php

    r70 r83  
    1313オプション 
    1414mode:"new"を指定すると、新番組(第1話)のみの表示となる。 
     15now:YmdHi形式で日付を指定するとその日からの番組表が表示される。 
    1516 
    1617 DCC-JPL Japan/foltia project 
     
    3233}//end if login 
    3334 
    34 $now = date("YmdHi");    
    35  
     35$now = getgetnumform(date); 
     36if(($now < 200001010000 ) || ($now > 209912342353 )){  
     37        $now = date("YmdHi");    
     38
    3639function printtitle(){ 
    3740 
     
    6467WHERE foltia_tvrecord.tid = foltia_program.tid  
    6568AND foltia_program.tid = foltia_subtitle.tid  
    66 AND foltia_subtitle.enddatetime >= '$now' 
    67  ORDER BY \"startdatetime\" ASC 
     69AND foltia_subtitle.enddatetime >= '$now'  
     70ORDER BY \"startdatetime\" ASC  
     71LIMIT 1000 
    6872        "; 
    6973        $reservedrssametid = m_query($con, $query, "DBクエリに失敗しました"); 
     
    112116LEFT OUTER JOIN foltia_station on (foltia_subtitle.stationid = foltia_station.stationid ) 
    113117WHERE foltia_tvrecord.stationid = 0 AND 
    114 foltia_subtitle.enddatetime >= '$now' ORDER BY \"startdatetime\" ASC 
     118foltia_subtitle.enddatetime >= '$now' ORDER BY \"startdatetime\" ASC  
     119LIMIT 1000 
    115120        "; 
    116121 
     
    145150WHERE foltia_program.tid = foltia_subtitle.tid AND foltia_station.stationid = foltia_subtitle.stationid  
    146151 AND foltia_subtitle.enddatetime >= '$now'  AND foltia_subtitle.countno = '1'  
    147 ORDER BY foltia_subtitle.startdatetime  ASC 
     152ORDER BY foltia_subtitle.startdatetime  ASC  
     153LIMIT 1000 
    148154        "; 
    149155        $rs = m_query($con, $query, "DBクエリに失敗しました"); 
     
    166172WHERE foltia_program.tid = foltia_subtitle.tid AND foltia_station.stationid = foltia_subtitle.stationid  
    167173 AND foltia_subtitle.enddatetime >= '$now'   
    168 ORDER BY foltia_subtitle.startdatetime  ASC 
     174ORDER BY foltia_subtitle.startdatetime  ASC  
     175LIMIT 1000 
    169176        "; 
    170177        $rs = m_query($con, $query, "DBクエリに失敗しました"); 
  • trunk/install/php/listreserve.php

    r70 r83  
    4646$mymemberid = getmymemberid($con); 
    4747$now = getgetnumform(startdate); 
     48*if ($now == ""){ 
     49$now = getgetnumform(date); 
     50} 
    4851 
    4952if ($now > 200501010000){ 
     
    6366foltia_subtitle.startoffset ,  
    6467foltia_subtitle.pid ,  
    65 foltia_subtitle.epgaddedby  
     68foltia_subtitle.epgaddedby ,  
     69foltia_tvrecord.digital  
    6670FROM foltia_subtitle , foltia_program ,foltia_station ,foltia_tvrecord 
    6771WHERE foltia_tvrecord.tid = foltia_program.tid AND foltia_tvrecord.stationid = foltia_station .stationid AND foltia_program.tid = foltia_subtitle.tid AND foltia_station.stationid = foltia_subtitle.stationid 
     
    7983foltia_subtitle.startoffset ,  
    8084foltia_subtitle.pid ,  
    81 foltia_subtitle.epgaddedby  
     85foltia_subtitle.epgaddedby ,  
     86foltia_tvrecord.digital  
    8287FROM foltia_tvrecord 
    8388LEFT OUTER JOIN foltia_subtitle on (foltia_tvrecord.tid = foltia_subtitle.tid ) 
     
    127132                        <th align="left">話数</th> 
    128133                        <th align="left">サブタイトル</th> 
    129                         <th align="left">開始時刻</th> 
     134                        <th align="left">開始時刻(ズレ)</th> 
    130135                        <th align="left">総尺</th> 
    131136                        <th align="left">画質</th> 
     137                        <th align="left">デジタル優先</th> 
    132138 
    133139                </tr> 
     
    165171foltia_tvrecord.bitrate  ,  
    166172foltia_subtitle.startoffset ,  
    167 foltia_subtitle.pid   
     173foltia_subtitle.pid  ,  
     174foltia_tvrecord.digital  
    168175FROM foltia_subtitle , foltia_program ,foltia_station ,foltia_tvrecord 
    169176WHERE foltia_tvrecord.tid = foltia_program.tid AND foltia_tvrecord.stationid = foltia_station .stationid AND foltia_program.tid = foltia_subtitle.tid AND foltia_station.stationid = foltia_subtitle.stationid 
     
    181188foltia_tvrecord.bitrate  ,  
    182189foltia_subtitle.startoffset ,  
    183 foltia_subtitle.pid   
     190foltia_subtitle.pid ,  
     191foltia_tvrecord.digital  
    184192FROM foltia_tvrecord 
    185193LEFT OUTER JOIN foltia_subtitle on (foltia_tvrecord.tid = foltia_subtitle.tid ) 
     
    218226foltia_tvrecord.bitrate  ,  
    219227foltia_subtitle.startoffset ,  
    220 foltia_subtitle.pid   
     228foltia_subtitle.pid  ,  
     229foltia_tvrecord.digital  
    221230FROM foltia_subtitle , foltia_program ,foltia_station ,foltia_tvrecord 
    222231WHERE foltia_tvrecord.tid = foltia_program.tid AND foltia_tvrecord.stationid = foltia_station .stationid AND foltia_program.tid = foltia_subtitle.tid AND foltia_station.stationid = foltia_subtitle.stationid 
     
    235244foltia_tvrecord.bitrate  ,  
    236245foltia_subtitle.startoffset ,  
    237 foltia_subtitle.pid   
     246foltia_subtitle.pid ,  
     247foltia_tvrecord.digital  
    238248FROM foltia_tvrecord 
    239249LEFT OUTER JOIN foltia_subtitle on (foltia_tvrecord.tid = foltia_subtitle.tid ) 
     
    277287                                        }else{ 
    278288                                        print "<a href=\"http://cal.syoboi.jp/tid/$tid\" target=\"_blank\">$title</a>"; 
     289 
    279290                                        } 
    280291                                        print "</td>\n"; 
     
    305316                                        //録画レート 
    306317                                        echo("<td>".htmlspecialchars($rowdata[7])."<br></td>\n"); 
     318                                         
     319                                        //デジタル優先 
     320                                        echo("<td>"); 
     321                                        if (htmlspecialchars($rowdata[11]) == 1){ 
     322                                        print "する"; 
     323                                        }else{ 
     324                                        print "しない"; 
     325                                        } 
     326                                        echo("<br></td>\n"); 
    307327                                echo("</tr>\n"); 
    308328                        } 
     
    313333 
    314334<table> 
     335        <tr><td>アナログ重複表示</td><td><br /></td></tr> 
    315336        <tr><td>エンコーダ数</td><td><?=$recunits ?></td></tr> 
    316337        <tr class="overwraped"><td>チューナー重複</td><td><br /></td></tr> 
     
    329350foltia_program .title , 
    330351foltia_tvrecord.bitrate , 
    331 foltia_tvrecord.stationid   
     352foltia_tvrecord.stationid ,  
     353foltia_tvrecord.digital    
    332354FROM  foltia_tvrecord , foltia_program , foltia_station  
    333 WHERE foltia_tvrecord.tid = foltia_program.tid  AND foltia_tvrecord.stationid = foltia_station .stationid    
     355WHERE foltia_tvrecord.tid = foltia_program.tid  AND foltia_tvrecord.stationid = foltia_station .stationid  
    334356ORDER BY foltia_program.tid  DESC 
    335357"; 
     
    354376                        <th align="left">録画リスト</th> 
    355377                        <th align="left">画質</th> 
     378                        <th align="left">デジタル優先</th> 
     379 
    356380                </tr> 
    357381        </thead> 
     
    385409                                        //MP4 
    386410                                        echo("<td><a href=\"showlibc.php?tid=$tid\">mp4</a></td>\n"); 
    387  
     411                                        //画質(アナログビットレート) 
    388412                                        echo("<td>".htmlspecialchars($rowdata[3])."<br></td>\n"); 
    389          
     413                                        //デジタル優先 
     414                                        echo("<td>"); 
     415                                        if (htmlspecialchars($rowdata[5]) == 1){ 
     416                                        print "する"; 
     417                                        }else{ 
     418                                        print "しない"; 
     419                                        } 
    390420                                echo("</tr>\n"); 
    391421                                }else{ 
     
    395425                                <td>EPG録画</td> 
    396426                                <td><a href=\"showlibc.php?tid=0\">mp4</a></td>"; 
    397                                 echo("<td>".htmlspecialchars($rowdata[3])."<br></td>\n</tr>"); 
     427                                echo("<td>".htmlspecialchars($rowdata[3])."<br></td>"); 
     428                                        //デジタル優先 
     429                                        echo("<td>"); 
     430                                        if (htmlspecialchars($rowdata[5]) == 1){ 
     431                                        print "する"; 
     432                                        }else{ 
     433                                        print "しない"; 
     434                                        } 
     435                                echo("\n</tr>"); 
    398436                                }//if tid 0 
    399437                        }//for 
  • trunk/install/php/m.php

    r77 r83  
    3535 
    3636$now = date("YmdHi");    
     37$today = date("Ymd"); 
     38$nowdate = date("Hi",(mktime(date("G"),date("i")+8,date("s"),date("m"),date("d"),date("Y")))); 
    3739$errflag = 0; 
    3840$pname = "手動録画"; 
     
    7476$recstid = getgetnumform(recstid); 
    7577$pname = getgetform(pname); 
     78//$usedigital = getgetnumform(usedigital); 
     79 
    7680//確認 
    7781$startdatetime = "$startdate"."$starttime"; 
     
    105109        } 
    106110} 
     111//デジタル優先 
     112/*if ($usedigital == 1){ 
     113}else{ 
     114        $usedigital = 0; 
     115} 
     116*/ 
    107117//正しければ 
    108118if ($errflag == 0){ 
     
    193203  <p>放送日: 
    194204    <input name="startdate" type="text" id="startdate" size="9" value="<?=$startdate?>" /> 
    195   年月日 Ex.19800121</p> 
     205  年月日 Ex.<?=$today?></p> 
    196206  <p>録画開始時刻: 
    197207    <input name="starttime" type="text" id="starttime" size="5" value="<?=$starttime?>" /> 
    198   時分 Ex.2304  </p> 
     208  時分 Ex.<?=$nowdate?>  </p> 
    199209  <p> 
    200210    録画尺: 
     
    205215<?php 
    206216$query = " 
    207 SELECT stationid,stationname,stationrecch  
     217SELECT stationid,stationname,stationrecch ,digitalch  
    208218FROM foltia_station  
    209219WHERE stationrecch > 0  
     220UNION  
     221SELECT DISTINCT  stationid,stationname,stationrecch ,digitalch  
     222FROM  foltia_station  
     223WHERE digitalch > 0 
    210224ORDER BY \"stationid\" ASC"; 
    211225 
     
    248262        } 
    249263} 
    250  
     264/* 
     265print "<p>デジタル録画を優先:"; 
     266 
     267if ($usedigital == 1){ 
     268print "<input name="useditial" type="radio" value="1" selected />  する  
     269<input name="useditial" type="radio" value="0" />  しない  
     270"; 
     271}else{ 
     272print "<input name="useditial" type="radio" value="1" />  する  
     273<input name="useditial" type="radio" value="0" selected />  しない  
     274"; 
     275
     276*/ 
    251277?> 
    252278  <p>番組名: 
  • trunk/install/php/reservecomp.php

    r70 r83  
    5454                $station = 0; 
    5555                } 
    56  
     56$usedigital = getgetnumform(usedigital); 
     57                if ($usedigital == "") { 
     58                $usedigital = 0; 
     59                } 
    5760$bitrate = getgetnumform(bitrate); 
    5861                if ($bitrate == "") { 
     
    202205 
    203206                if ($maxrows == 0) { //新規追加 
    204                                 $query = "INSERT INTO  foltia_tvrecord  values ('$tid','$station','$bitrate')"; 
     207                                $query = "INSERT INTO  foltia_tvrecord  values ('$tid','$station','$bitrate','$usedigital')"; 
    205208                                $rs = m_query($con, $query, "DB書き込みに失敗しました"); 
    206209                }else{//修正 (ビットレート) 
    207210                        $query = "UPDATE  foltia_tvrecord  SET  
    208   bitrate = '$bitrate' WHERE tid = '$tid'  AND stationid = '$station' 
    209                         "; 
     211  bitrate = '$bitrate' , digital = '$usedigital'  WHERE tid = '$tid'  AND stationid = '$station' "; 
    210212                        $rs = m_query($con, $query, "DB書き込みに失敗しました"); 
    211213                } 
  • trunk/install/php/reserveepgcomp.php

    r70 r83  
    7878        }else{ 
    7979        $rowdata = pg_fetch_row($rs, 0); 
     80         
    8081        $insertpid = $rowdata[0]; 
    81         $insertpid-- ; 
     82                if ($insertpid > 0){ 
     83                $insertpid = -1; 
     84                }else{ 
     85                $insertpid-- ; 
     86                } 
    8287        } 
    8388// next 話数を探す 
     
    121126values ( '$insertpid','0','$stationid', 
    122127        '$nextcno','$subtitle','$startdatetime','$enddatetime','0' ,'$lengthmin' , '$memberid')"; 
    123  
    124128        $rs = m_query($con, $query, "DBクエリに失敗しました"); 
    125129 
     
    143147} 
    144148 
    145 ?> 
    146149 
    147  
    148 <?php 
    149150print "<table width=\"100%\" border=\"0\"> 
    150151    <tr><td>放送開始</td><td>$startdatetime</td></tr> 
  • trunk/install/php/reserveprogram.php

    r70 r83  
    8989  <tr> 
    9090    <td>放送局</td> 
    91     <td>ビットレート</td> 
     91    <td>デジタル録画優先</td> 
     92    <td>アナログビットレート</td> 
    9293  </tr> 
    9394  <tr> 
     
    128129 
    129130        </td> 
     131         
     132        <td> 
     133        <select name="usedigital"> 
     134        <?php 
     135         if ($usedigital == 1){ 
     136                print " 
     137                <option value=\"1\" selected>する</option> 
     138                <option value=\"0\">しない</option> 
     139                "; 
     140                }else{ 
     141                print " 
     142                <option value=\"1\">する</option> 
     143                <option value=\"0\" selected>しない</option> 
     144                "; 
     145                } 
     146        ?> 
     147        </select> 
     148        </td> 
     149 
    130150    <td><select name="bitrate"> 
    131151        <option value="14">最高画質</option> 
  • trunk/install/php/selectcaptureimage.php

    r70 r83  
    116116        $tid = ereg_replace("[^0-9]", "", $tid); 
    117117 
    118 $path = ereg_replace("\.m2p$", "", $m2pfilename); 
     118$path = ereg_replace("\.m2p$|\.m2t$", "", $m2pfilename); 
    119119$serveruri = getserverfqdn (); 
    120120 
     
    124124 
    125125if (file_exists("./sb-edit.php") ) { 
    126 print "<a href=\"./sb-edit.php?pid=$pid&f=$filetid\"><img src='http://$serveruri$httpmediamappath/$tid.localized/img/$path/$filetid' width='160' height='120' alt='$tid:$countno:$filetid'></a>\n"; 
     126print "<a href=\"./sb-edit.php?pid=$pid&f=$filetid\"><img src='http://$serveruri$httpmediamappath/$tid.localized/img/$path/$filetid' alt='$tid:$countno:$filetid'></a>\n"; 
    127127}else{ 
    128 print "<img src='http://$serveruri$httpmediamappath/$tid.localized/img/$path/$filetid' width='160' height='120' alt='$tid:$countno:$filetid'>\n"; 
     128print "<img src='http://$serveruri$httpmediamappath/$tid.localized/img/$path/$filetid' alt='$tid:$countno:$filetid'>\n"; 
    129129} 
    130130}//foreach 
  • trunk/install/php/showlib.php

    r70 r83  
    3636<head> 
    3737<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 
    38 <meta http-equiv="Content-Style-Type" content="text/css"> 
    39 <link rel="stylesheet" type="text/css" href="graytable.css">  
    40 <link rel="alternate" type="application/rss+xml" title="RSS" href="./folcast.php" /> 
     38<?php 
     39if (file_exists  ( "./iui/iui.css"  )){ 
     40        $useragent = $_SERVER['HTTP_USER_AGENT']; 
     41
     42if(ereg("iPhone",$useragent)){ 
     43print "<meta name=\"viewport\" content=\"width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;\"/> 
     44<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"./img/icon.png\" /> 
     45 
     46<style type=\"text/css\" media=\"screen\">@import \"./iui/iui.css\";</style> 
     47<script type=\"application/x-javascript\" src=\"./iui/iui.js\"></script>"; 
     48}else{ 
     49print "<meta http-equiv=\"Content-Style-Type\" content=\"text/css\"> 
     50<link rel=\"stylesheet\" type=\"text/css\" href=\"graytable.css\">  
     51<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"./folcast.php\" />"; 
     52
     53?> 
    4154<title>foltia:MP4 Lib</title> 
    4255</head> 
    4356 
    4457<?php 
    45 $now = date("YmdHi");    
     58$now = date("YmdHi");   
     59if(ereg("iPhone",$useragent)){ 
     60        print "<body onclick=\"console.log('Hello', event.target);\"> 
     61    <div class=\"toolbar\"> 
     62        <h1 id=\"pageTitle\"></h1> 
     63        <a id=\"backButton\" class=\"button\" href=\"#\"></a> 
     64    </div> 
     65"; 
     66}else{ 
     67        print "<body BGCOLOR=\"#ffffff\" TEXT=\"#494949\" LINK=\"#0047ff\" VLINK=\"#000000\" ALINK=\"#c6edff\" > 
     68<div align=\"center\"> 
     69"; 
     70        printhtmlpageheader(); 
     71print "  <p align=\"left\"><font color=\"#494949\" size=\"6\">録画ライブラリ表示</font></p> 
     72  <hr size=\"4\"> 
     73<p align=\"left\">再生可能ライブラリを表示します。<br> 
     74"; 
     75}  
    4676 
    47 ?> 
    48 <body BGCOLOR="#ffffff" TEXT="#494949" LINK="#0047ff" VLINK="#000000" ALINK="#c6edff" > 
    49 <div align="center"> 
    50 <?php  
    51         printhtmlpageheader(); 
    52 ?> 
    53   <p align="left"><font color="#494949" size="6">録画ライブラリ表示</font></p> 
    54   <hr size="4"> 
    55 <p align="left">再生可能ライブラリを表示します。<br> 
    56  
    57 <? 
    5877//新仕様 /* 2006/10/26 */ 
    5978$query = " 
     
    7089 
    7190if ($maxrows > 0 ){ 
     91if(ereg("iPhone",$useragent)){ 
     92        print "<ul id=\"home\" title=\"録画ライブラリ表示\" selected=\"true\">"; 
     93}else{ 
    7294print " 
    7395  <table BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"2\" WIDTH=\"100%\"> 
     
    82104        <tbody> 
    83105"; 
     106} 
    84107for ($row = 0; $row < $maxrows; $row++) { 
    85108        $rowdata = pg_fetch_row($rs, $row); 
     
    90113$counts = htmlspecialchars($counts); 
    91114 
     115if(ereg("iPhone",$useragent)){ 
     116print "<li><a href=\"showlibc.php?tid=$tid\" target=\"_self\">$title</a></li>\n"; 
     117}else{ 
    92118print " 
    93119<tr> 
     
    98124</tr>\n 
    99125"; 
     126} 
    100127}//for 
     128 
     129if(ereg("iPhone",$useragent)){ 
     130        print "</ul>\n</body>\n</html>\n"; 
     131}else{ 
    101132print " 
    102133        </tbody> 
     
    105136</html> 
    106137"; 
     138} 
     139 
    107140}else{ 
    108141print "録画ファイルが存在しません。</body></html>"; 
  • trunk/install/php/showlibc.php

    r74 r83  
    4141<head> 
    4242<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> 
    43 <meta http-equiv="Content-Style-Type" content="text/css"> 
    44 <link rel="stylesheet" type="text/css" href="graytable.css"> 
    45 <script src="http://images.apple.com/main/js/ac_quicktime.js" language="JavaScript" type="text/javascript"></script>  
    4643<?php 
    47 print "<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"./folcast.php?tid=$tid\" /> 
    48 "; 
    49                 if ($tid == "") { 
     44if (file_exists  ( "./iui/iui.css"  )){ 
     45        $useragent = $_SERVER['HTTP_USER_AGENT']; 
     46
     47if(ereg("iPhone",$useragent)){ 
     48print "<meta name=\"viewport\" content=\"width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;\"/> 
     49<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"./img/icon.png\" /> 
     50<style type=\"text/css\" media=\"screen\">@import \"./iui/iui.css\";</style> 
     51<script type=\"application/x-javascript\" src=\"./iui/iui.js\"></script>"; 
     52}else{ 
     53print "<meta http-equiv=\"Content-Style-Type\" content=\"text/css\"> 
     54<link rel=\"stylesheet\" type=\"text/css\" href=\"graytable.css\"> 
     55<script src=\"http://images.apple.com/main/js/ac_quicktime.js\" language=\"JavaScript\" type=\"text/javascript\"></script>  
     56<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"./folcast.php?tid=$tid\" /> 
     57"; 
     58
     59if ($tid == "") { 
    5060        print "<title>foltia:Lib</title> 
    5161</head><body BGCOLOR=\"#ffffff\" TEXT=\"#494949\" LINK=\"#0047ff\" VLINK=\"#000000\" ALINK=\"#c6edff\" > \n"; 
    5262                printhtmlpageheader(); 
    5363                die_exit("再生可能番組がありません<BR>"); 
    54                
     64       
    5565$now = date("YmdHi");    
    5666 
     
    7585} 
    7686//ヘッダ続き 
    77 print "<title>foltia:Lib $tid:$title</title> 
    78 </head> 
    79 <body BGCOLOR=\"#ffffff\" TEXT=\"#494949\" LINK=\"#0047ff\" VLINK=\"#000000\" ALINK=\"#c6edff\" > 
     87print "<title>foltia:Lib $tid:$title</title></head>"; 
     88$serveruri = getserveruri(); 
     89 
     90if(ereg("iPhone",$useragent)){ 
     91        print "<body onclick=\"console.log('Hello', event.target);\"> 
     92    <div class=\"toolbar\"> 
     93        <h1 id=\"pageTitle\"></h1> 
     94        <a id=\"backButton\" class=\"button\" href=\"#\"></a> 
     95    </div> 
     96"; 
     97}else{ 
     98 
     99print "<body BGCOLOR=\"#ffffff\" TEXT=\"#494949\" LINK=\"#0047ff\" VLINK=\"#000000\" ALINK=\"#c6edff\" > 
    80100<div align=\"center\"> 
    81101"; 
     
    84104  <hr size=\"4\"> 
    85105<p align=\"left\">再生可能ムービーを表示します。<br>"; 
    86  
    87 $serveruri = getserveruri(); 
    88106if ($tid == 0){ 
    89107print "$title 【<A HREF = \"./folcast.php?tid=$tid\">この番組のFolcast</A> [<a href=\"itpc://$serveruri/folcast.php?tid=$tid\">iTunesに登録</a>】 <br>\n"; 
     
    93111                                     htmlspecialchars($tid)  . "\" target=\"_blank\">$title</a> 【<A HREF = \"./folcast.php?tid=$tid\">この番組のFolcast</A> [<a href=\"itpc://$serveruri/folcast.php?tid=$tid\">iTunesに登録</a>]】 <br>\n"; 
    94112} 
     113}// endif if(ereg("iPhone",$useragent)) 
     114 
    95115//確認 
    96116if (file_exists ("$recfolderpath/$tid.localized")){ 
     
    101121        exit; 
    102122}                                         
    103  
    104  
    105123 
    106124//新仕様/* 2006/10/26 */ 
     
    133151$maxrows = pg_num_rows($rs); 
    134152if ($maxrows > 0 ){ 
     153if(ereg("iPhone",$useragent)){ 
     154        print "<ul id=\"home\" title=\"$title\" selected=\"true\">"; 
     155}else{ 
    135156print " 
    136157  <table BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"2\" WIDTH=\"100%\"> 
    137158        <tbody> 
    138159"; 
    139  
     160
    140161for ($row = 0; $row < $maxrows; $row++) { 
    141162        $rowdata = pg_fetch_row($rs, $row); 
     
    178199 
    179200if (($sbpluginexist == 1) && (pg_num_rows ($rs ) > 0)){ 
    180  $capimgpath = htmlspecialchars(preg_replace("/.m2p/", "", $rowdata[5])); 
     201 //$capimgpath = htmlspecialchars(preg_replace("/.m2p/", "", $rowdata[5])); 
     202 $capimgpath = htmlspecialchars(preg_replace("/.m2./", "", $rowdata[5])); 
    181203         
    182204        if (($capimgpath != "") && (file_exists("$recfolderpath/$tid.localized/img/$capimgpath") )){ 
     
    195217} 
    196218 
    197  
     219if(ereg("iPhone",$useragent)){ 
     220 
     221print "<li><a href=\"http://$serverfqdn/$httpmediamappath/$tid.localized/mp4/$fName\" target=\"_self\">$count $subtitle $onairdate</a></li>\n"; 
     222 
     223}else{ 
    198224print "  <tr> 
    199225    <td rowspan=\"4\" width=\"170\"><a href = \"$httpmediamappath/$tid.localized/mp4/$fName\" target=\"_blank\"><img src = \"$imgsrcuri\" width=\"160\" height=\"120\"></a></td> 
     
    202228  <tr> 
    203229"; 
    204 if ($tid == 0){ 
    205 print "\n    <td>$subtitle</td>"; 
    206 }else{ 
    207 print "\n    <td><a href = \"http://cal.syoboi.jp/tid/$tid/time#$pid\" target=\"_blank\">$subtitle</a></td>"; 
    208 }//if 
     230       if ($tid == 0){ 
     231       print "\n    <td>$subtitle</td>"; 
     232       }else{ 
     233       print "\n    <td><a href = \"http://cal.syoboi.jp/tid/$tid/time#$pid\" target=\"_blank\">$subtitle</a></td>"; 
     234       }//if 
    209235print "  </tr> 
    210236  <tr> 
     
    216242"; 
    217243 
     244}//endif iPhone 
     245 
    218246}//for 
    219247}else{ 
    220248print "録画ファイルがありません<br>\n"; 
    221249}//if 
     250 
     251if(ereg("iPhone",$useragent)){ 
     252        print "<li><a href=\"http://$serveruri/showlib.php\" target=\"_self\">一覧へ戻る</a></li>\n"; 
     253        print "</ul>\n"; 
     254}else{ 
     255        print "</tbody></table>\n"; 
     256} 
    222257?> 
    223         </tbody> 
    224 </table> 
    225  
    226258</body> 
    227259</html> 
     260 
     261         
  • trunk/install/php/showplaylist.php

    r70 r83  
    1414 省略時、録画順にソートされる。 
    1515 titleのときに、番組順ソートされる。 
    16  rawのときに、DBに記録されている番組録画情報ではなくディレクトリにあるm2pファイルを全て表示する。 
     16 rawのときに、DBに記録されている番組録画情報ではなくディレクトリにあるm2p/m2tファイルを全て表示する。 
    1717 
    1818 DCC-JPL Japan/foltia project 
     
    9797//旧仕様 
    9898if($list == "raw"){ 
    99 exec ("ls -t  $recfolderpath/*.m2p", $m2pfiles); 
     99exec ("ls -t  $recfolderpath/*.m2?", $m2pfiles); 
    100100 
    101101 
     
    106106 
    107107        if(($fName == ".") or ($fName == "..") ){ continue; } 
    108         if (ereg(".m2p", $fName)){ 
     108        if (ereg(".m2.+", $fName)){ 
    109109                $filesplit = split("-",$fName); 
    110110         
     
    230230} 
    231231        if (file_exists("./selectcaptureimage.php") ) { 
    232         $capimgpath = preg_replace("/.m2p/", "", $fName); 
     232        $capimgpath = preg_replace("/.m2.+/", "", $fName); 
    233233        print "                 <td align=\"left\"><a href=\"./selectcaptureimage.php?pid=$pid\">キャプ</a></td>\n"; 
    234234        } 
track feed