Foltia with AppleScript

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

録画の予定を確認

録画の予定を確認

BSチャネルを2チャンネル起動していると画像が安定することを記述しました。 BSチャネルライブ視聴を開始したり停止したりするタイミングや、録画が停止したときにB-CASカードリーダをリセットしたりするタイミングを判定する必要があります。そのためには録画予定の情報を取り出す必要があります。

方法としては2個ありますね。 一つはFoltiaサーバーが運用しているpostgresqlを外部からSQLコマンドで情報を取り出す方法と、Foltiaのweb interfaceの録画予定情報のHTML情報から必要な情報を抜き出てデータ化する方法です。 前者は外部からpsqlアクセス出来る様に設定が必要です。また本来対話式のpsqlコマンドをパスワードログインを.pgpassにIDとパスワードを記載してSingle lineでデータベース情報を取り出す必要があります。 これは確実で情報処理スピードという意味から言うと最も早いですが、その環境をセットするのは案外大変です。 できない事は無いですが、出来たらやりたく無いです。 

そこで今回はbasic認証をつかってFoltiaのweb interface http://foltia.local/reservation/の情報を取り出して整形してみる事にしました。 その際何度もrepeatをコールしなくても良い様に、時間のパラメーター情報を取り出してあります。

まあどんな風に動くか以下のアップルスクリプトを動かしてみると良いでしょう。 ちなみに以下のスクリプト

foltialog.hatenablog.com

にある3つのスクリプトDropbox/Script/module/以下にセットしないと動きません。

FoltiaRecStatus.scpt

set q to {foltia:"foltia", pswd:"*****"}

return FoltiaRecStatus(q)

 

on FoltiaRecStatus(q)

     --戻り値はブランク

     set q to q & {erro:"", foltia:"foltia", WarmUpTime:20, LiveBootUpNum:2, PCSC_errorMax:40, bug:false, pswd:""}

     set q to q & {web:q's foltia & ".local"}

     set bug to q's bug

     set q0 to q

     

     set cmd to "curl --basic -u curl:" & q0's pswd & " http://" & q's web & "/reservation/||true"

     set oText to do shell script cmd

     set N to load script file ( ( (path to home folder from user domain) as string) & "Dropbox:Scripts:module:HTML_pub.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

     set q1 to TrimByTag({source_:oText, key_:"<div id=\"reservedTable\">", key_end:"<!-- /id=reserveTable/end -->"}) of N

     if q1's found is false then return {erro:LogOnConsoleR({cmt:"Foltiaサーバー起動していない", open_:false}) of L} & q

     

     

     log "時間変数を定義"

     set cTime to do shell script "date -v+" & q's WarmUpTime & "M +'%Y-%m-%d %H:%M'"

     --cTime: checkTime Warm Up 時間を想定し、現在より未来の時間を想定する、 sTime < cTimeとなればワームアップ開始

     set curTime to do shell script "date +'%Y-%m-%d %H:%M'"

     --curTime: 現在時間

     set eTime to do shell script "date -v+600M +'%Y-%m-%d %H:%M'" #デフォルト値

     set e3Time to eTime

     --eTime: Recording中の一番直近の終了時間 e3Timeはその3分前

     set s3Time to eTime #デフォルト値

     --s3TimeStanbyRecording (StByRec)の最小開始時間から3分前

     set sTime to eTime #デフォルト値

     --sTimeStanbyRecording (StByRec)の最小開始時間

     

     set tList to MakeList(q1's oText, "</tr>") of N

     if (count of tList) is 1 then return {erro:LogOnConsoleR({cmt:"</tr>が見つからない、パスしてMainフレームへ", open_:false}) of L} & q

     set L_NowRec to {}

     --L_NowRecは現在記録中の番組情報のリスト

     set L_StByRec to {}

     --L_StByRecは現時点からWarmUpTimeまでの間に開始される番組のリスト

     set L_OverRec to {}

     --L_OverReceTimeに記録している番組リストを選択する予定でしたが、eTimerepeat中に移動するので上手く取り出せてないと思います。 今は使う予定無しです

     repeat with aBangumi in tList

          set iBangumi to {} ## station, title_, subtitle_,date_,time_

          set aBangumi to aBangumi's contents

          set station to do shell script "echo " & quoted form of aBangumi & "|tr \\\\r \\\\n|grep '<td class=\"station\">'|sed -e 's/<[^>]*>//g'||true"

          if station is not "" then

               set title_ to do shell script "echo " & quoted form of aBangumi & "|tr \\\\r \\\\n|grep '<td class=\"title\">'|sed -e 's/<[^>]*>//g'||true"

               set subtitle_ to do shell script "echo " & quoted form of aBangumi & "|tr \\\\r \\\\n|grep '<td class=\"subtitle\">'|sed -e 's/<[^>]*>//g'||true"

               set start_ to do shell script "echo " & quoted form of aBangumi & "|tr \\\\r \\\\n|grep '<td class=\"date\">'|sed -e 's/<[^>]*>//g'|sed -e 's/([^)]*)//g'|sed -e 's/ $//g'|sed -e 's|/|-|g'||true"

               

               set time_ to do shell script "echo " & quoted form of aBangumi & "|tr \\\\r \\\\n|grep '<td class=\"time\">'|sed -e 's/<[^>]*>//g'||true"

               set end_ to do shell script "date -v+" & time_ & "M -j -f '%Y-%m-%d %H:%M' " & quoted form of start_ & " +'%Y-%m-%d %H:%M'"

               set bs to false

               if text 1 thru 2 of station is "BS" then set bs to true

               if cTime < start_ then exit repeat

               

               set iBangumi to {station:station, title_:title_, subtitle_:subtitle_, start_:start_, time_:time_, end_:end_, bs:bs}

               

               if curTimestart_ then

                    set L_NowRec to L_NowRec & {iBangumi}

                    if end_ < eTime then set eTime to end_

               else if (start_eTime) and (end_ > eTime) then

                    set L_OverRec to L_OverRec & {iBangumi}

                    set L_StByRec to L_StByRec & {iBangumi}

               else

                    set L_StByRec to L_StByRec & {iBangumi}

               end if

               

          end if

     end repeat

     set q0 to q0 & {NowRec:L_NowRec, StByRec:L_StByRec, OverRec:L_OverRec}

     

     set e3Time to do shell script "date -v-3M -j -f '%Y-%m-%d %H:%M' " & quoted form of eTime & " +'%Y-%m-%d %H:%M'"

     if (count of L_StByRec) > 0 then

          set sTime to (L_StByRec's item 1)'s start_

          set s3Time to do shell script "date -v-3M -j -f '%Y-%m-%d %H:%M' " & quoted form of sTime & " +'%Y-%m-%d %H:%M'"

     end if

     set q0 to q0 & {curTime:curTime, cTime:cTime, eTime:eTime, sTime:sTime, s3Time:s3Time, e3Time:e3Time}

     

     return q0

     

end FoltiaRecStatus

 

なみにpswdに以前 htpasswdで作成したcurlに対するパスワードを入れてください。

foltialog.hatenablog.com

ここでは伏せ字にしてます。
書き出されたq0はレコード形式です。

結果−>{foltia:"foltia", erro:"", WarmUpTime:20, LiveBootUpNum:2, PCSC_errorMax:40, bug:false, pswd:"******", web:"foltia.local", NowRec:{{station:"NHK-BS1", title_:"キーワード録画", subtitle_:"", start_:"2024-02-27 13:00", time_:"120", end_:"2024-02-27 15:00", bs:false}}, StByRec:{{station:"テレビ東京", title_:"キーワード録画", subtitle_:"", start_:"2024-02-27 13:40", time_:"120", end_:"2024-02-27 15:40", bs:false}}, OverRec:{{station:"テレビ東京", title_:"キーワード録画", subtitle_:"", start_:"2024-02-27 13:40", time_:"120", end_:"2024-02-27 15:40", bs:false}}, curTime:"2024-02-27 13:30", cTime:"2024-02-27 13:50", eTime:"2024-02-27 15:00", sTime:"2024-02-27 13:40", s3Time:"2024-02-27 13:37", e3Time:"2024-02-27 14:57"}

と情報が書き出されてくるのが解ります。 

パラメータの説明を加えておきましょう 

  • WarmUpTimeは今は20に設定してますが、Live視聴を録画何分前から準備するかという設定です。 
  • LiveBootUpNumは BSの起動しているチャネルを何個に設定するかと言う項目で、こちらは2をデフォルトにしてます。
  • PCSC_errorMaxは B-CASカードの読み込みエラー pcscdのエラーが直近2分の間に何個以上あればカードをリセットするかを指定してます。 大体ですが 177エラーで10個以上有るようなら大抵それ以降全くエンコード出来なくなっていると思います。 このエラーは最近カードリーダを変えてからほとんどヒットしなくなりました。 カードリーダの選定は後日また別のセクションで記載して見ます。
  • webは フォルティアサーバーのwebのURLを設定してます。 これは例えばご自身でdomainを取得しておられたり、Dynamic DNSサービスを利用していて、WANからNATを介してフォルティアサービスにアクセスする場合の設定です。 関数の引数でqを明示しておくと2行目でレコードqの結合で左辺が優先されますので、明示して入力したDNSサービス名を利用することが出来ます。 何言ってるか解らない人は無視して良いでしょう。 解る人には解るものです。
  • 引数qをスクリプト内でq0にsetしているのは、間違って引数qをハンドラ内で上書きしてしまったり、バグ取り目的で設定しているq0が入力値のqを明らかに違うことを意識するための物です。 pswdの設定は本来テキストに直書きしてたので、この原稿のため急遽設定していて、q0で引用してますが、qの方が解りやすいかもしれませんね。 次項では修正しておきますわ。
  • ちなみにマックでdo shell scriptでgrepを行う場合、マックの変数で扱われたテキストデータの改行が\rになっている事を留意する必要があります。これをtrで\nに変更しておかないと思ったようにgrepで行を切り出すことが出来ません。 アップルスクリプト上でも\はエスケープ文字として利用されるので、エスケープ文字を記載するためにエスケープが必要で合計逆スラッシュが4個必要になります。これがマック上でgrepを使う一つのテクニックとなります。

次回予告

次はこのFoltiaRecStatusにpcscdエラーの監視、recpt1の実行モニターのためのの行を書き足していきます。