Foltia with AppleScript

Foltia animelockerのトラブルシューティング

ライブ視聴を起動する

いよいよ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:"予想外のLiveBootUpNum0以下", 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

www.dropbox.com

最後は起動する物理チャネル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にいくつかのオプションを搭載して見ます

  1. 激しいDropノイズの後のエンコードが長時間掛かった時の自動解除 comskip.exe, ffmpeg, neoAacEnc, BonTsDemuxC.exeの時間上限設定
  2. tsファイルのドラッグドロップからのHandBrakeCLIを使った簡易エンコードFoltiaのEncodeを待たずにすぐに録画番組を見たい)。
  3. 録画予定3ページ分のチューナの重複チェックFoltia本来の重複チェックは予約番組の前後のマージン発生による重複をチェックしていないのでその重複をあらかじめ確認し、BS/地上波がそれぞれあらかじめ5番組以上重複しない様に予約を取捨選択する。
    1. 予約した番組が時間変更したりした際に、重複することを定期的に教えてくれるようになります。

今私の所で搭載している機能はこれ以外にも映画なんかのキーワード予約でとった長時間データをtsからmp4に録画終了後に自動的に変換し、その後別のマックでエンコードしたりしてます。 映画の2時間のMP4エンコードって結構時間掛かるので、すぐに見たいアニメーションなんかが映画のエンコード待ちに引っかかってなかなか見れなかったりするのを予防できます。

でもまあこういった物はオプションでもありますのでFoltiaサーバーできちんとした映像を撮るのに必要な機能ではないのでもう少し後で紹介して見ましょう。

こういったオプションの話をする前に、私が注意しているアップルスクリプトコードの書き方のTipsをしばらく紹介して見ます。 これを知ることで、今まで紹介したコードが読みやすくなると思います。