いよいよFoltiaRecStatusのラスト ライブ視聴を起動する
いよいよ最後です。 最後は現在のBSの録画数・BSライブ視聴数を合計して q's LiveBootUpNum以上になる様にLive起動を開始するパートになります。
on FoltiaRecStatus(q)
--戻り値はブランク
--中略
log "ここに来るのは BScount(Rp_BSCT) < q's LiveBootUpNum の場合のみ そしてCIDは 128であると思うが自信はない"
set CID to 128
set LiveBootUpNum to ((q's LiveBootUpNum) - Rp_BSCT)
if LiveBootUpNum ≤ 0 then return {erro:LogOnConsoleR({cmt:"予想外のLiveBootUpNumが0以下", open_:false}) of L} & q0
if (do shell script "Echo " & quoted form of BSrecptsid_Live & "|tr \\\\r \\\\n|grep -e '211'||true") is not "" then set CID to "129"
if not bug then
set q1 to LiveChannel2({LiveBootUpNum:LiveBootUpNum, OnOf:"on", CID:CID, foltia:q's foltia}) of me
if q1's erro is not "Safariのバッファーがチャージされない" then return q0
LogOnConsoleR({cmt:"Live起動に失敗1回目はカードリセット", open_:false}) of L
--一回目はCardReset
--set q1 to LiveChannel2({OnOf:"AllOff"}) of me
ReflesUSBCardReader(q) of me
set q1 to LiveChannel2({LiveBootUpNum:LiveBootUpNum, OnOf:"on", CID:CID, foltia:q's foltia}) of me
if q1's erro is not "Safariのバッファーがチャージされない" then return q0
LogOnConsoleR({cmt:"Live起動に失敗2回目はハードリスタート", open_:false}) of L
--2回目はリセットする
P00_foltia_restart_single(q) of me
end if
return q0
end FoltiaRecStatus
最後は起動する物理チャネルCIDを計算し、それが決まったら必要な個数のLive視聴を起動させます。 LiveChannel2できちんとライブ視聴が始まらなければ、 ReflesUSBCardReaderが起動し、結果としてB-CASカードがリセットされます。 もちろんこのとき録画されている番組は全部中断しちゃいますが、ほとんどの場合そういった状況だと番組録画自体が停止している事が多く、リフレッシュが早いか遅いかだけの違いとなります。 より次の録画を失敗しないための損切りです。
もう一度LiveChannel2を起動させても上手くライブ視聴が始まらなければph00_foltia_restart_singleでフォルティアサーバーをハード的に再起動させると言う行動に出ます。
一度実行して見て動作を確認したら、後はこのscptファイルを~/Dropbox/Scripts/module/内に格納して、さらに本体のM-loop_pubから呼び出して見ましょう。
M-loop_pubからの呼び出し
これを登録するとほぼ完成です。 先日記載したこれ。
この~/Dropbox/Scripts/M-loop_pub.scptをちょっと編集して見ましょう。
今回M-loop_pubは前回のパーツに加えて MainReOpen、つまり動作中にクリックすることで出現するプログラム実行時の選択肢に、"USBカードリーダのリセット", "foltiaの再起動"を加えています。それらのハンドラは、FoltiaRecStatusに含まれていますので load script file で呼び出してます。
またMainLoop内の初期変数の指定で、今回curlで使用したWebログインのためのパスワード(pswd)を格納しておきます。 このpswdは各自自分の設定したパスを入れる必要が有ります。 つまり平文テキストでパスワードがファイルに残るのでこの部分のパスワードは頻回に変更することが想定されますし、システムの根幹 sshで使用されるパスとは別に用意した方が良いわけです。 セキュリティー的に甘くなりますから。
新しいM-loop_pubは下記に示してます。
property gP : {}
on idle {}
set f to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias
set gP to MainLoop(gP) of f
return gP's loopPerSec
end idle
on reopen
set f to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias
set q to MainReOpen(gP) of f
return q's loopPerSec
end reopen
on open of theFile
set f to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias
set null_ to MainDrop(theFile) of f
return gP's loopPerSec
end open
on MainDrop(theFile) --Manually_HandBrakeCLI(q)
end MainDrop
on MainReOpen(q)
set q to q & {foltia:"foltia", JPVolume:"JP-file-style"}
set a to (display dialog "選択" buttons {"続行", "停止する", "プログラムを実行テストする"} default button "続行" giving up after 5)'s button returned
set T to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Terminal.scpt") as alias
set R to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:FoltiaRecStatus.scpt") as alias
set L to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Log_ForConsole_pub.scpt") as alias
if a is "" or a is "続行" then
else if a is "停止する" then
continue quit
else if a is "プログラムを実行テストする" then
set MenuList to {"qファイルを表示", "ローカルログ表示", "USBカードリーダのリセット", "foltiaの再起動", "戻る"}
set TG to choose from list MenuList with prompt "どのプログラムを実行しますか?"
if TG is false then set TG to {"戻る"}
if TG is {"qファイルを表示"} then
LogOnConsole({cmt:{pswd:""} & q, open_:true}) of L
else if TG is {"ローカルログ表示"} then
term({ActionList:{"", "$Here", "Tail -f " & quoted form of (((path to documents folder from user domain) as string)'s POSIX path & "M-loop_pub.log"), ""}, closeWindow:false}) of T
else if TG is {"USBカードリーダのリセット"} then
ReflesUSBCardReader(q) of R
else if TG is {"foltiaの再起動"} then
P00_foltia_restart_single(q) of R
else if TG is {"戻る"} then
end if
set q to {loopPerSec:1} & q
end if
return q
end MainReOpen
on MainLoop(q)
set q to {status:"good", erro:false, loopPerSec:50, pswd:"*******"} & q & {foltia:"foltia", JPVolume:"JP-file-style"}
--pswdは各自自分の環境に合わせて記載してください。
set L to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Log_ForConsole_pub.scpt") as alias
--set N to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:HTML_pub.scpt") as alias
set R to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:FoltiaRecStatus.scpt") as alias
if ((do shell script "ping -t 1 -c 1 " & q's foltia & ".local||true") is "") then return {erro:true, status:LogOnConsoleR({cmt:"サーバーにPingが通らず", open_:false}) of L} & q
FoltiaRecStatus(q) of R
return q
end MainLoop
こんな形でFoltiaResStatusハンドラをM-loop_pub.appのアプリケーションに組み込むことが出来ました。 おそらくこれで最低限Live視聴機能が働いて、Foltiaの録画画像が安定するでしょう。
おそらく以前作ったM-loop_pub.appをそのままクリックして起動すると、自動的にフォルティアサーバーの録画状況を確認してLive視聴を実行し、録画が終了したらLive視聴を停止して、B-CASカードをリセットしてくれると思います。 ひとまずの完成ですね。
この後の予定
このM-loop_pubにいくつかのオプションを搭載して見ます
- 激しいDropノイズの後のエンコードが長時間掛かった時の自動解除 comskip.exe, ffmpeg, neoAacEnc, BonTsDemuxC.exeの時間上限設定
- tsファイルのドラッグドロップからのHandBrakeCLIを使った簡易エンコード(FoltiaのEncodeを待たずにすぐに録画番組を見たい)。
- 録画予定3ページ分のチューナの重複チェック:Foltia本来の重複チェックは予約番組の前後のマージン発生による重複をチェックしていないのでその重複をあらかじめ確認し、BS/地上波がそれぞれあらかじめ5番組以上重複しない様に予約を取捨選択する。
- 予約した番組が時間変更したりした際に、重複することを定期的に教えてくれるようになります。
今私の所で搭載している機能はこれ以外にも映画なんかのキーワード予約でとった長時間データをtsからmp4に録画終了後に自動的に変換し、その後別のマックでエンコードしたりしてます。 映画の2時間のMP4エンコードって結構時間掛かるので、すぐに見たいアニメーションなんかが映画のエンコード待ちに引っかかってなかなか見れなかったりするのを予防できます。
でもまあこういった物はオプションでもありますのでFoltiaサーバーできちんとした映像を撮るのに必要な機能ではないのでもう少し後で紹介して見ましょう。
こういったオプションの話をする前に、私が注意しているアップルスクリプトコードの書き方のTipsをしばらく紹介して見ます。 これを知ることで、今まで紹介したコードが読みやすくなると思います。