カレンダーイベントの情報を読み取ってコマンド実行(第三弾)【Mac|AppleScript】

コンピュータ関連
スポンサーリンク

実現しようとしているのはネット配信番組の動画を予約録画すること。
そのスケジューラにはMac標準アプリのカレンダーを使用。

今回は「あらかじめ登録したイベント情報(URL)をAppleScriptで読み込む」ように改良してみました。

スポンサーリンク

カレンダーイベントをスケジューラとして使う

第一弾は「URLを含めた録画コマンドを実行するアプリ」でした。
それをカレンダーイベントから起動することで録画を実現させました。
しかし単発の配信でもわざわざAutomatorからアプリとして作らなくてはならず、少々野暮ったい。面倒臭い。

【Mac】カレンダーを使って指定した時間(定期的)にコマンドを実行する
前回はSHOWROOMでライブ配信されているストリーミング動画を youtube-dl や ffmpeg を使ってダウンロード(保存)する方法を紹介しました。 無事に配信動画を保存できるようになりましたが、 そのためには毎回ターミナ...

第二弾は「予約リスト」と「実行ファイル」に分けてファイルを用意し、
予約リストに時間とURL、カレンダーに時刻を設定することで実現させました。
が、これも録画の開始時間を予約リスト、カレンダーイベントの両方に書かなくてはならず、二度手間でよろしくない。冗長。

ネット配信番組を予約録画するスクリプト第二弾【Mac】
先日シェアしたネット配信動画(showroom等)をMacで予約録画する方法。 少し改良して「予約リスト」と「録画実行アプリ」に分け、 リストを読み込むことで録画するよう変えてみました。 スケジューラは前回と同じくカレンダーを...

今回の第三弾は予約リストをやめ、カレンダーイベントに登録した情報を読み取って録画するようにしてみます。

カレンダーイベントの情報を読み取る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
追記(2020/10/13):「秒数を00に変更」の部分で前方から数えていた文字数を後方から2文字(thru -3)の設定に変更。以前のものは一桁の日付や時間によって変わってしまい動作しない時がありました。(11時→8時など。08にならないことを見落としてました)

AppleScript

現在の時間から同時刻に設定されたイベントを検索します。
ただカレンダーアプリから登録するイベントでは秒数が指定できません。それゆえ”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-dlのリトライ設定(試行回数)について
デフォルトでリトライ設定(試行回数)のオプションがあるにも関わらず、たまに尻切れで終わってしまう現象と対策について。 youtube-dlを使い始めてなんとなく見えてきたものを(まだ不完全ながら)備忘録としてまとめてみます。 ち...

youtube-dler の行の最後にある「&」はバックグランド実行させるため。
これによって並列処理が可能になります。

そうしないと「同時刻に二つの番組を録画したい!」てな場合に対処できなくなるので。(その予定はないのですが一応念のため)

※同時刻に複数起動することは可能です。ただし時間をずらして例えば30分後に二つ目の番組を録画したい場合、前の番組が終了していないと録画できないようです。これは恐らくカレンダーから呼び出す際の多重起動ができないため。非常に面倒くさいのですが、ATコマンドやターミナルから直接起動しないといけませんので要注意。

以上を終えたら保存します。
名前は「stream_rec.app」としました。
アプリケーションとして保存。

~/mytools/stream_rec.app

スポンサーリンク

カレンダーから新規イベント登録

カレンダーを開き、録画したい時間に新規イベントを登録します。

希望日を右クリックから「新規イベント
右上のカレンダー(グループ)リストではスクリプトに記述した名前を選択。

適当な名前を付けて、「開始」には録画を開始する時間を入力。終了にも同じ時刻を入力します。(※起動してから録画までは若干タイムラグがあります。もし撮り逃したくなければ1分前とかにしておくといいかも)
必要なら「毎週」などの繰り返しを選んでください。
「通知」から「カスタム」を選び、「ファイルを開く」>「stream_rec.app」、「イベントの開始時刻」と設定します。

イベント登録

下の方へ行き「URLを追加」と書かれた欄に録画したいURLを書き込みます。

※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

コメント

タイトルとURLをコピーしました