録画の予定を確認
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をコールしなくても良い様に、時間のパラメーター情報を取り出してあります。
まあどんな風に動くか以下のアップルスクリプトを動かしてみると良いでしょう。 ちなみに以下のスクリプトは
にある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 #デフォルト値
--s3TimeはStanbyRecording (StByRec)の最小開始時間から3分前
set sTime to eTime #デフォルト値
--sTimeはStanbyRecording (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_OverRecはeTimeに記録している番組リストを選択する予定でしたが、eTimeがrepeat中に移動するので上手く取り出せてないと思います。 今は使う予定無しです
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 curTime ≥ start_ 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に対するパスワードを入れてください。
ここでは伏せ字にしてます。
書き出された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の実行モニターのためのの行を書き足していきます。