Foltia with AppleScript

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

Foltia番組の重複チェック:アップルスクリプト

目的

Foltiaの予約番組リストは予約番組が重複していると色を付けて教えてくれるんですよね。 ただアニメやその他のキーワードで拾ってくる録画予約は週ごとに放映時間が変わったりしていつの間にか同時予約数が番組予約より多くなってることってありますよね。 チューナーの上限を超えると確か録画が全停止したような気がします。 最近うちのシステムでは起こってないので、もう覚えてないんですけどね。

番組予約上限はその他にも番組録画の最後と最初に付いてる1分ぐらいのマージンがあって、そのためFoltia側が重複してると認識していなくても切り替えの時期に重複していてチューナー上限を超えてしまうこともあります。 あと意外に解りにくいのが毎時50分にされてるePEGデーターの取り込みにチューナを使ってるので、その際に同時利用チャネル数が上限を超えているかもしれません(もしかしたら安全策がfotia側で取られているかもしれませんが・・・。)

これって毎日マニュアルで目で確認してたら結構大変な作業なんですよ。 なので私はこう言うのはAppleScriptに任せてます。 

アップルスクリプト記述

私の場合、Main_Loop内に 06:55になったらチェックする様にしてます。 こんな感じの記載を加えてますかね。

if (do shell script "date +'%H:%M'") is "06:55" then JamCheck({}) of R

これでFoltiaRecStatus.scpt内に下の様なハンドラを入れて見ましょう。

--return jamcheck({})

on jamcheck(q)

     set q to q & {erro:"", foltia:"foltia", web:"foltia.local", MaxChannel:4, pswd:""}

     set Jufuku to ( (q's MaxChannel) + 1)

     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 foltiaURL to "curl --basic -u curl:" & q's pswd & " http://" & q's web & "/reservation/index.php?p="

     set So to ""

     repeat with i from 1 to 3 --3ページ目まで読み込んで処理します

          set so1 to do shell script (foltiaURL & i as text)

          set q1 to TrimByTag({source_:so1, key_:"<table>", key_end:"</table>"}) of N

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

          set So to So & q1's oText

     end repeat

     

     set SoList to Makelist(So, "<tr class=") of N

     set BSArray to {}

     set GNDArray to {}

     repeat with OneSo in SoList

          set OneSo to OneSo's contents

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

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

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

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

          set d_ to do shell script "echo " & quoted form of date_ & "|sed 's/([^)]*)//g'|sed 's/ $//g'||true"

          

          

          if station is not "" and ( (offset of "BS" in station) > 0) then set BSArray to BSArray & {{station:station, title:title, StartT:(date d_) - 60, EndT:(date d_) - 60 * time_}}

          if station is not "" and ( (offset of "BS" in station) = 0) then set GNDArray to GNDArray & {{station:station, title:title, StartT:(date d_) - 60, EndT:(date d_) - 60 * time_}}

     end repeat

     set comment to ""

     --BS

     set max_ to (count BSArray)

     repeat with i from 1 to (max_)

          set Res1 to (item i of BSArray)'s contents

          set start1 to Res1's StartT

          set Dup to {Res1}

          repeat with ii from 1 to max_

               if i is not ii then

                    set Res2 to (item ii of BSArray)'s contents

                    if (Res2's StartTstart1) and (Res2's EndT > start1) then

                         set Dup to Dup & {Res2}

                    end if

                    if (count Dup) ≥ Jufuku then

                         set comment to comment & "| [" & Res1's title & ":" & Res1's station & "~~" & ( (Res1's StartT) + 60) & "]" & Jufuku & "番組以上と重複しています" & (ASCII character (13) )

                         log Dup

                         exit repeat

                    end if

               end if

          end repeat

     end repeat

     

     --地上波

     set max_ to (count GNDArray)

     repeat with i from 1 to (max_)

          set Res1 to (item i of GNDArray)'s contents

          set start1 to Res1's StartT

          set Dup to {Res1}

          repeat with ii from 1 to max_

               if i is not ii then

                    set Res2 to (item ii of GNDArray)'s contents

                    if (Res2's StartTstart1) and (Res2's EndT > start1) then

                         set Dup to Dup & {Res2}

                    end if

                    if (count Dup) ≥ Jufuku then

                         set comment to comment & "| [" & Res1's title & ":" & Res1's station & "~~" & ( (Res1's StartT) + 60) & "]" & Jufuku & "番組以上と重複しています" & (ASCII character (13) )

                         log Dup

                         exit repeat

                    end if

               end if

          end repeat

     end repeat

     if comment is "" then return true

     return {erro:LogOnConsoleR({cmt:comment, open_:false}) of L} & q

     --slack(comment & q's foltia) of L

     --return comment

end jamcheck

 

このハンドラは実は記述が重複(地上波とBS)している部分があってあまり美しくないですし、メッセージがログに隠れちゃう事があって目に入りにくいかもしれませんね。 

あと結構遅いです、最初のcurlのソース取り込みに時間がかかるようで、体感としては15秒ぐらい掛かる感じがします。 私の場合エラーがあればSlackにメッセージが来る様にしてますが、皆さんが一番良く使ってるメッセンジャーで利用されるのが良いでしょうね。 LINEとかでも良いんじゃ無いでしょうか? ちなみに私全くLINE使ってないんで・・・。

さらにrepeatの2重がけでインデントが多いです。

このハンドラは1年以上前に作った物で、当時からほとんど変更していないんですよ。 それぐらい安定していて修正する部分がないのと、ほとんど1週間とか2週間に一度ぐらい思い出した様に反応が戻ってくるんで、番組の編成期に一度番組予約をセットしちゃうとその後ほとんど動作してる感じが無いです。 まあ安全装置みたいな物なので、どちらかというと安全性重視になってます。 

MaxChannelは最大の同時記録チャネル数に当たりますが、皆さんの環境に合わせて数を設定されると良いと思います。 記録の安定を望むならq's MaxChannelは3に設定しておくと良いかもしれませんね。 私の環境だとePEGの読み込みを録画予約が多い時間帯から外しているので、4で大丈夫そうです。 

 

 

HandBrakeCLIを用いた簡易エンコーダー3:foltiaオプション編

前回のph01_check(q) とPh02_HandBrakeCLI(q)を前回作ったFoltiaRecStatus.scptに追記して、M-loop_pubにもいくつか追記して見ましょう。

www.dropbox.com

以前のやつに上書きして見てください。

www.dropbox.com

これも同様です。 M-loop_pub.appは以前の物を使って大丈夫です。 そのままDropbox内の新しいM-loop_pub.scptを読み込んでくれます。

M-loop_pubは前回空白にしていたMainDrop(theFile)に以下を記入

on MainDrop(theFile) --Manually_HandBrakeCLI(q)

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

    set q to {theFile:theFile}

    set q to q & {oFolder:(path to movies folder from user domain) as string}

    repeat with aFile in theFile

        set aFile to (aFile's contents) as alias

        tell application "Finder"

            set name_t to do shell script "echo " & (name of aFile as string)'s quoted form & "|sed -e 's/\\.[0-9,a-z,A-Z]*$//'"

            set ext to aFile's name extension

            set iFolder to (aFile's container) as string

            set aFileName to name of aFile as string

        end tell

        

        if ext is "ts" then

            LogOnConsole({cmt:"ドラッグされました。HandbrakeCLIを手動起動", open_:false}) of L

            Ph02_HandBrakeCLI({iFolder:iFolder, ListOfKeyContainFile:{name_t}, iFileTail:".ts"} & q) of R

        else if ext is "mp4" then

            --適切なフォルダへ移動させるといったハンドラを作って動作させても良いでしょうね。

        end if

    end repeat

    LogOnConsole({cmt:"DropFileプロセスは正常終了", open_:false}) of L

end MainDrop

 

Main_loop(q)側は以下の様に記載を追加してます。

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

    set q to Ph01_Check(q) of R --キーワードに相当するファイルがあるかどうかを検索して、Handbrakeで操作が必要なファイル名を ListOfKeyContainFileで戻す

    if (q's erro) or (q's ListOfKeyContainFile is {}) then return q --statusエラーがあったり、リストが戻ってこなければLoopに戻す

    set q to Ph02_HandBrakeCLI(q) of R

    return q

    

end MainLoop

 

拡張子tsが付いてるファイルをドラッグドロップすると、Ph02_HandBrakeCLIの中の記述に沿って、そのまま低圧縮のMPEG4ファイルに変換するか、高速閲覧用の720pの低クオリティーの録画に圧縮するか決めてくれます。

起動するとこんな感じでTerminal windowが開いてエンコードが始まります。

M1 processor MacOSだとこの warning, too many B-frames in a rowが頻発するんですけれど、ちゃんと書き出しされているのであまり気にせずに待ちましょう。

まあこのエンコードしている間はFoltiaのチェックをしてくれないので、時間などを指定してエンコードさせたりするのも良いかもしれませんね。 書き出し先を好きな場所に指定するには引数 qの oFolderを自分の目的の場所に設定しておけば、明示されたoFolderに書き出してくれます。

 

これだと、キーワードファイル KeyWordForHandbrakeCLI.txt に記載しておくと、録画完了と共にエンコードが開始されます。 MPEG2ファイルのCM編集を設定すると、この状況だとCM編集が始まる前にエンコードが始まり、終わって古いtsファイルが上書きされても、2回目のエンコードはしてくれませんので、MPEG2のCM編集は切りにしておくか、書き出し後のファイルの作成時間をコメント欄に記載したりして、CM切り出し前のファイル作成時間を記載しておいて、変更があれば再度エンコード実行したりしても良いのかもしれませんが、今回は複雑になるのでそういう設定はしてません。 

こんな物でしょうか? 

 

 

今度は録画予定の番組の重複チェックを定期的に行うオプションを紹介して見ます。

 

HandBrakeCLIを用いた簡易エンコーダー2:foltiaオプション編

さて今回はマックのMovieフォルダ内の KeyWordForHandbrakeCLI.txt と言うファイルに例えば

_シネマ「
_映画「
金曜ロードショー
土曜洋画劇場
#土曜映画デラックス
サタ☆シネ
葬送のフリーレン

といった感じにキーワードを登録しておきます。 まあ自分で好きなファイル名に変更してアップルスクリプト内の記載を変更してもらっても良いと思います。

また今回はフォルティアサーバーの共有ボリューム "JP-file-style"をあらかじめマウントした上で現時点から1時間前の録画記録をJP-file-style:01-全録画:2024:03:MPEG2: フォルダ内を検索して、そのデーターがHandBrakeCLIでの書き出しフォルダoFolder内に格納されていなければ、q's ListOfKeyContainFile に登録して、Ph02_HandBrakeCLI(q)を稼働させる事にするわけですね。

 

on Ph01_Check(q)

    --このパートは, JP-file-styleをマウントし、q's iFolder内にKeywordファイルがあるかどうかを確認し、あればq's ListOfKeyContainFileにリスト形式で返却する。

    set q to q & {foltia:"foltia", JPVolume:"JP-file-style", KeyFile:( (path to movies folder from user domain) as string) & "KeyWordForHandbrakeCLI.txt", iFolder:"JP-file-style:01-全録画:" & (do shell script "date -v-1H +%Y:%m:MPEG2:"), oFolder:(path to movies folder from user domain) as string, ListOfKeyContainFile:{}}

    set L to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Logs_forConsole_pub.scpt") as alias

    

    --JPVolumeフォルダをマウントする、Macの場合は一回はあらかじめマウントしてキーワードなどはキーチェーンに登録しておく必要があり

    tell application "Finder" to set Diskls to (every disk whose displayed name is q's JPVolume)

    try

        tell application "Finder"

            if Diskls is {} then

                if ((do shell script "ping -t 1 -c 1 " & q's foltia & ".local||true") is "") then return {erro:true} & q

                mount volume "smb://" & q's foltia & ".local/" & q's JPVolume

                LogOnConsole({cmt:"JP-file-styleを再マウントしました", open_:true}) of L

            end if

        end tell

    on error

        LogOnConsole({cmt:"JP-file-styleがマウントできない", open_:false}) of L

        return {erro:true} & q

    end try

    --マウントされなければq's erro trueを返す

    

    --KeyWordForHandbrakeCLI.txt を探し改行で区切られたテキストキーワードをList変数 _lsに格納する

    set f to (q's KeyFile as alias)'s POSIX path

    set ls to do shell script "cat " & quoted form of f & "| grep -v '^#'|grep -v '^//'||true"

    set _ls to every paragraph of (do shell script "echo " & quoted form of ls)

    

    set ListOfKeyContainFile_i to {}

    repeat with key_ in _ls

        set key_ to (key_'s contents)

        set ListOfKeyContainFile_i to ListOfKeyContainFile_i & every paragraph of (do shell script "ls " & quoted form of (POSIX path of (q's iFolder) ) & "|grep " & quoted form of key_ & "||true")

    end repeat

    --return ListOfKeyContainFile_i

    

    --キーワード録画はエンコード方法を変える方向で行く 

    --書き出しファイルからキーワード録画の名前が消えるので、エンコード後のファイルがあるかどうかの判断を行う

    set ListOfKeyContainFile to {}

    repeat with key_ in ListOfKeyContainFile_i

        set key_ to key_'s contents

        set key_cut to do shell script "echo " & key_'s quoted form & "| sed -e 's/\\.[a-z]*$//'| iconv -f UTF-8-MAC -t UTF-8|sed -e 's/_キーワード録画_[0-9]*_/_/g'"

        set key_ to do shell script "echo " & key_'s quoted form & "| sed -e 's/\\.[a-z]*$//'"

        

        try

            set key_cut to text 1 thru 20 of key_cut --長すぎる名前はカットする

        end try

        set oFile to do shell script "ls " & quoted form of (POSIX path of (q's oFolder as alias) ) & "| iconv -f UTF-8-MAC -t UTF-8|grep " & quoted form of key_cut & "||true"

        if oFile is "" then set oFile to do shell script "ls " & quoted form of (POSIX path of (q's oFolder as alias) ) & "|grep " & quoted form of key_cut & "||true"

        --該当するファイルがoFolder内に無ければoFile""となっている。 

        if (oFile is "") then set ListOfKeyContainFile to ListOfKeyContainFile & {key_} --カットする前のListOfKeyContainFile_i内のデータを保管する        

    end repeat

    return {ListOfKeyContainFile:ListOfKeyContainFile} & q

end Ph01_Check

 

こんな形でしょうかね、次回はこれをM-loop_pubに搭載して見ましょう。

 

 

 

 

 

HandBrakeCLIを用いた簡易エンコーダー1:foltiaオプション編

今回からoptionについて提示してみましょう。 今回はHandBrakeCLIを使って、foltiaとは関連無くtsファイルをエンコードして書き出す方法です。

これは様々な理由でとりあえず録画した番組を早くみたいと思う人や、映画番組などの時間の長い記録をfoltiaに負担をかけること無くエンコードしたい人もいらっしゃるんじゃ無いでしょうか? エンコードは案外時間がかかりますし、夜中や自分が作業していないときに自動でやってくれると助かったりします。 

今回のオプションはキーワードを列挙したテキストファイルに適合したtsファイルをあらかじめ自動でマック上でエンコードしてすぐに視聴できる状態にしておくというオプションです。
HandBrakeのGUIバージョンは扱いやすいですが、連続して自動でエンコードをするという目的にはあまりそぐわなかったりします。 

handbrake.fr

またアップルスクリプトに完全対応してませんし、System Eventを用いたGUI Scriptingをする場合は最近のOSだとアプレットからのGUIスクリプティングには制限が掛かります。 あとGUI多用は誤作動の原因となる事が多いです。 なので今回はcommand lineだけで作業出来る、Handbrake CLIを使う事にしました。

HandBrakeCLI

HandBrake: Downloads

まずはダウンロードして/Applicationsフォルダに HandBrakeCLIを置いて見ましょう。

このHandbrakeCLIのオプションはググればいくつも出てきますが、先ず自分で動かしてみることが大事です。 そうしないと全くイメージつかめないと思います。 このCLIバージョンはGUIバージョンのデフォルトのフィルターを全てそのまま使えます。 

HandbrakeCLIの基本はTerminalで

/Applications/HandBrakeCLI -i <入力ファイル> -o <出力ファイル>

と入力してエンターすることで動き始めます。 オプションは色々あるみたいなのでググって見てください。 慣れるとGUIバージョンより使い易いです。 

今回はこれをアップルスクリプトに組み込んで、Terminalを開いてエンコードさせるという根幹の部分を提示しておきましょう。

(*

q's ListOfKeyContainFile に入力された、拡張子無しのファイル名リストを、順番にエンコードしてゆきます。

_キーワード録画_ が入ったファイルは基本的に映画などのファイルなので基本的に低圧縮でほぼtsファイルと同じファイルサイズになる様にffmpeg4 quality 3ぐらいでエンコードして見てます。 数字を大きくすると画像が粗く、小さくすると綺麗になります。ファイルサイズはその逆ですね。

一方でそれ以外はHandBrakeに含まれるPresetFilterを指定してそれでエンコードします。 デフォルトでは短時間で粗い画質でも問題ないのでVery Fast 720p30を使ってます。 これは自分で入力q内で明示するとそちらが優先されます。

*)

on Ph02_HandBrakeCLI(q)

    set q to q & {iFolder:"", oFolder:(path to movies folder from user domain) as string, fin:false, ListOfKeyContainFile:{}, PresetFilter:"Very Fast 720p30", iFileTail:".ts", oFileTail:".mp4", TimeOutMin:60, quality:3}

    set T to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Terminal.scpt") as alias

    set L to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Logs_forConsole_pub.scpt") as alias

    repeat with mFile in q's ListOfKeyContainFile

        set mFile to mFile's contents

        set iFile to (((q's iFolder as alias)'s POSIX path) & mFile & q's iFileTail)'s quoted form

        set oFile to ((q's oFolder as alias)'s POSIX path & (do shell script "Echo " & quoted form of mFile & "| iconv -f UTF-8-MAC -t UTF-8|sed -e 's/_キーワード録画_[0-9]*_/_/g'") & q's oFileTail)'s quoted form --キーワード録画 部分はカットした。

        if (offset of "_キーワード録画_" in mFile) = 0 and q's PresetFilter is not "" then

            set cmd to "/Applications/HandBrakeCLI -Z " & quoted form of q's PresetFilter & " -i " & iFile & " -o " & oFile --HandbrakeCLI -i <入力ファイル> -o <出力ファイル>

        else

            set cmd to "/Applications/HandBrakeCLI -e 'ffmpeg4' -q " & q's quality & " --crop 0:0:0:0 --vfr -i " & iFile & " -o " & oFile

        end if

        

        LogOnConsole({cmt:"\\n開始:HandBrakeCLI " & mFile, open_:false}) of L

        term({ActionList:{"", "$Here", cmd, "$Here"}, ti:1, wSec:3600, closeWindow:false, WaitBusy:true}) of T --確認のためしばらくclosewindow falseで動作させる2023/12/02

        LogOnConsole({cmt:"終了:HandBrakeCLI \\n", open_:false}) of L

    end repeat

    return q

end Ph02_HandBrakeCLI

 

こんな感じで設定してます。このユニットはMainLoopで動作させても良いですし、ファイルをドロップすると動作するってやり方にしても良いわけです。 

次回はListOfKeyContainFileを取り出す部分を紹介して見ましょう

 

 

load scriptはglobalが良いのかlocalが良いのか:アップルスクリプト

load scriptはglobalが良いのかlocalが良いのか

アップルスクリプトの変数はハンドラ内だけで定義されるlocal変数と、ハンドラ以外でもスクリプト全体で定義されるglobalな変数があります。

property gF : load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias

-->グローバル変数gFへのM-loop_pub.scptのロード、スクリプトのトップに宣言されることが多い

 

 

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

    -->ローカルハンドラ内でのfへのM-loop_pub.scptのロード

    set gP to MainLoop(gP) of f

    return gP's loopPerSec

end idle

 

今回のスクリプトはload scriptで別ファイルのスクリプトを変数内に格納してハンドラをコールしてますが、この際格納する変数をglobalにするかlocalで定義するかはいろいろ異論があると思います。  ちなみに私はlocal派です。

古いApplescriptの教本やネット上の記載を見るとサブScriptはグローバル変数に格納されていることがほとんどですね。 昔のマックは遅かったしファイルを読み込みに行くのにも少し時間がかかったからってのもあると思うんですが、最近のハードはディスクアクセスが早いですし今回の私のスクリプトでは全部ハンドラ内(ローカル)に読み込んでます。 そのメリットとデメリットをまとめて見ましょうか?

Load scriptをGlobal変数に格納するメリット

  • サブスクリプトコンパイルしてセーブするときにファイルにアクセスしてセーブするので、ハンドラを呼び出すたびにディスクアクセスが発生しないため速度が速いはず。
  • サブスクリプトが消滅したり、メインスクリプトを他人に渡したりする時にサブのスクリプトファイルを他人に渡す必要が無くてパスワードの管理などが楽? あと著作権とか?

Load scriptをGlobal変数に格納するデメリット

  • ファイルをセーブするタイミングでのサブスクリプトの情報で固定されるので、サブスクリプトを編集するたびにメインのスクリプトを変更する必要がある。 さらに孫スクリプトとかを作ってたりすると、全て修正するために全てのファイルを開けたり閉じたりする必要がある。
  • 場合によっては、孫スクリプトを直接メインスクリプトにロードする必要があったりすると、同じ記述が重なってメインスクリプトにロードされることになり、回帰的な重複が生じる場合がある。
  • アップルスクリプトスクリプトファイルは目安として1MBを超えるとセーブ不能になるため、大きな子プロセスの中のほんの一個だけのハンドラをロードするためにメインスクリプトのファイルサイズが予想外に大きくなる場合がある。 スクリプトを修正していたら突然セーブ出来なくなるという事態を経験することがある。
  • スクリプトファイルを編集してもすぐに親スクリプトに反映されないため、バグ取りの際に修正されたはずの物が修正されていなくて混乱することがある。
  • 最近のSSDを使った速いバスシステムと最大ファイル数1MBのアップルスクリプトのデーターロード時間は、現実的にプログラムの体感実行時間にあまり大きな影響を及ぼさない事が多い。
  • ファイルサイズに上限があるので、子スクリプトは自然と細切れになり、ロードするスクリプトが多くなりすぎる。 また同系統のハンドラが別のファイルに存在すると管理が難しくなるし、同系統のハンドラ同士で使い回しが有った場合、さらに管理がややこしくなる。 なので出来れば同系統のハンドラを1個のファイルで管理したい。

20年まえならいざ知らず、今のマックならLoad scriptはlocal変数に格納すべきだと思います。

 

これで私が書くアップルスクリプトのコンセプトは網羅したと思います。 じゃあそろそろ次ぐらいからfoltia用のM-loop_pubに付けるオプションを記載して見ましょうか?

最初はHandBrakeCLIの利用オプションです。