実現しようとしているのはネット配信番組の動画を予約録画すること。
そのスケジューラにはMac標準アプリのカレンダーを使用。
今回は「あらかじめ登録したイベント情報(URL)をAppleScriptで読み込む」ように改良してみました。
カレンダーイベントをスケジューラとして使う
第一弾は「URLを含めた録画コマンドを実行するアプリ」でした。
それをカレンダーイベントから起動することで録画を実現させました。
しかし単発の配信でもわざわざAutomatorからアプリとして作らなくてはならず、少々野暮ったい。面倒臭い。
第二弾は「予約リスト」と「実行ファイル」に分けてファイルを用意し、
予約リストに時間とURL、カレンダーに時刻を設定することで実現させました。
が、これも録画の開始時間を予約リスト、カレンダーイベントの両方に書かなくてはならず、二度手間でよろしくない。冗長。
今回の第三弾は予約リストをやめ、カレンダーイベントに登録した情報を読み取って録画するようにしてみます。
カレンダーイベントの情報を読み取るAppleScript
今回もまたAutomatorでアプリケーションを作成します。
そしてAppleScriptとシェルスクリプトの合わせ技。
(作業環境:macOS 10.13.6 High Sierra)
アプリケーション > Automator
起動したら「アプリケーション」を選択し、「AppleScriptを実行」を右のペインに持ってきます。
あらかじめ入力されている「on run」ハンドラは省略可能らしいのでもうすっぱりと全消去。
以下のスクリプトを入力します。
try tell application "Calendar" --現在時刻の取得 set CurrentTime to (current date) as text --秒数を00に変更 set CurrentTime to AppleScript's date ((characters 1 thru -3 of CurrentTime as text) & "00") --このカレンダーの名前(StreamRec)から時刻でイベント検索 set EvList to every event of calendar "StreamRec" whose start date = CurrentTime set urls to {} repeat with theEvent in EvList set the end of urls to url of theEvent --設定されたURL取得 end repeat return urls end tell end try
現在の時間から同時刻に設定されたイベントを検索します。
ただカレンダーアプリから登録するイベントでは秒数が指定できません。それゆえ”00”になっている時間に合わせて調整します。
カレンダーの名前(紛らわしいですがカレンダーアプリのメニュー「ファイル > 新規カレンダー」から作成できるグループ名みたいなもの)に「StreamRec」と命名。
その名前で登録されているイベントから該当するものを探し出します。
(なのでここは好きな名前に変えてもらって構いません。)
見つかったイベントからその「URL欄」に記入されていたURLを次のシェルスクリプトに渡します。
各イベントから得た情報(URL)で録画を開始する
先ほどのAppleScriptの下に今度は「シェルスクリプトを実行」をドラッグ&ドロップ。
以下のスクリプトを入力します。
export PATH=$PATH:/usr/local/bin if [ $# -ge 1 ]; then for url in "$@"; do youtube-dler "${url}" --config-location ~/mytools/ydconfig/config & done fi
シェルは「/bin/bash」
入力の引渡し方法は「引数として」
(※追記:引数が空かどうかのif文追加しました。画像には無いけど)
こちらではまずパスを設定し、
先ほどのURL情報を受け取り、
以前作った録画用自作コマンド(youtube-dler)を呼び出しています。
また設定ファイル(config-location)には数を減らしたリトライ回数などが記述されています。その辺の詳細はこちらから。
youtube-dler の行の最後にある「&」はバックグランド実行させるため。
これによって並列処理が可能になります。
そうしないと「同時刻に二つの番組を録画したい!」てな場合に対処できなくなるので。(その予定はないのですが一応念のため)
以上を終えたら保存します。
名前は「stream_rec.app」としました。
アプリケーションとして保存。
~/mytools/stream_rec.app
カレンダーから新規イベント登録
カレンダーを開き、録画したい時間に新規イベントを登録します。
希望日を右クリックから「新規イベント」
右上のカレンダー(グループ)リストではスクリプトに記述した名前を選択。
適当な名前を付けて、「開始」には録画を開始する時間を入力。終了にも同じ時刻を入力します。(※起動してから録画までは若干タイムラグがあります。もし撮り逃したくなければ1分前とかにしておくといいかも)
必要なら「毎週」などの繰り返しを選んでください。
「通知」から「カスタム」を選び、「ファイルを開く」>「stream_rec.app」、「イベントの開始時刻」と設定します。
下の方へ行き「URLを追加」と書かれた欄に録画したいURLを書き込みます。
これで設定は完了です。
プライバシー設定について
初回だけ起動時に「未使用のアプリケーションを開こうとしています」という確認ウインドウが出ます。(例として”test.app”という名前)
また「カレンダーにアクセスしようとしています」といったプライバシー設定の許可をもとめるウインドウも出てきます。
それぞれ「開く」「OK」で許可してあげてください。
環境設定 > セキュリティとプライバシー
「カレンダー」の項目に許可設定が出てくると思います。
チェックが入っているか確認しておきましょう。
まとめ
これで予約した時間に録画を開始してくれるはずです。
前回までのものに比べてだいぶ扱いやすくなったかなと。
カレンダーはやっぱりわかりやすいですよね。
配信中止なんかの時はカレンダーを開いてイベント削除すれば事足りるし。
これがcronとか使うと予定を消すのもターミナルからコマンド打ち込んで・・・になるのでちょっと面倒。
あともう一つ考えないといけないのが「起動またはスリープ解除」の設定。
今回はカレンダーイベントの通知を利用しているため、スリープ状態にあるときは実行してくれないのです。
寝過ごされないように時間になったら起きてくれるよう設定する必要があります。
pmsetコマンドで起動またはスリープ解除
一応pmsetコマンドには触れておきます。
cronと違ってMacを起こすだけなので、設定を消し忘れてもあまり問題にはなりませんから。
仮に「04/18/20 21:00:00」に実行したい場合、その3分ほど前に起こしておけばいいでしょう。
ターミナルを開いてから
sudo pmset schedule wake "04/18/20 20:57:00"
と入力してください。続いてパスワードが求められるので入力。
これで指定した時間にMacが起動(スリープ解除)します。
スケジュールの確認は
pmset -g sched
スケジュールを削除したい時は
各スケジュールの先頭の数字(0〜)で指定します。
sudo pmset schedule cancel 0
コメント