Apple kafe: Kombinace Automatoru, Zkratek a AppleScript10 minut čtení

Automatizace na macOS může výrazně zefektivnit práci, zejména pokud využíváte nástroje jako Automator, Zkratky (Shortcuts) a AppleScript. V tomto krátkém článku si ukážeme, jak lze tyto nástroje propojit.

Několikrát se mi stalo, že jsem při úpravě fotografií zapomněl vypnout True Tone nebo Night Shift, které mění barevné spektrum monitoru. Několik fotek jsem proto “udělal špatně” a musel jsem je po uvědomění si této chyby udělat znovu.

Napadlo mě tedy udělat si automatizaci, která kontroluje, zda běží aplikace Capture One 20 (ve které zpracovávám fotografie), a na základě toho přizpůsobí nastavení True Tone a Night Shift v systému macOS.

To, co zní jako jednoduché zadání, ovšem nakonec až zas tak jednoduché nebylo.


Začínáme

Pojďme si to rozdělit do kroků, které potřebujeme udělat:

  1. Periodická kontrola, že je spuštěn proces Capture One 20.
  2. Pokud ano, tak nastavit True Tone a Night Shift na OFF.
  3. Pokud ne, zapnout True Tone a zkontrolovat jestli je po 17 hodině. Pokud ano, zapnout Night Shift.
  4. Kontrolu spuštění Capture One 20 udělat se zámkem. Z důvodu, že když neběží a udělám změnu nastavení ručně, aby mi tato automatizace neměnila nastavení.

Mapa procesu by tedy vypadala následovně:

První překážky a volba řešení

A tady narazíme na první překážku. Co použít, pokud si chceme zachovat relativní jednoduchost takového řešení? Nabízí se nám 3 integrované nástroje pro automatizaci pod macOS.

1. Zkratky

No-code aplikace přímo od Apple, která umí pracovat se systémovými nastaveními.

  1. Nelze je spouštět na pozadí tak, aby něco periodicky kontrolovaly.
  2. Nezjistí jestli je daná aplikace je spuštěná.
  3. Naopak ale umí nativně nastavovat True Tone a Night Shift režim. To se nám bude určitě hodit!

2. Automator

No/Low-code řešení Automator mám osobně rád. Dá se v něm udělat dost automatizací, třeba i pro složky apod. Bohužel, už dlouhou řadu let není Applem aktualizován. Nebo alespoň já mám z toho takový pocit.

  1. Neumí nastavit True Tone a Night Shift přímo z Automatoru.
  2. Teoreticky lze výslednou automatizaci spouštět dokola nadřazeným skriptem. Popřípadě automatizaci zacyklit a spustit jí jednou. Bohužel není to optimální řešení, už jen kvůli tomu, že by nám běžela aplikace Automator.
  3. Nakonec tuto aplikaci pro naše řešení nevyužijeme.

3. AppleScript

Tohle už je čisté kódování. AppleScript je dnes už spíš jen pro opravdové nadšence a málokdo z uživatelů macOS vůbec ví na co je ona aplikace Editor Scriptů. Stále funkční, ale bohužel, Apple už také nepřidává nové aktualizace. Například poslední aktualizace dokumentace je z roku 2016.

  1. Lze napsat script, který by běžel ve smyčce na pozadí.
  2. Velké možnosti práce se systémovými informacemi. Umí zjistit přes SystemEvent, zda je některý proces spuštěn či nikoliv.
  3. Neumí přímo přistupovat k systémovým proměnným pro True Tone a Night Shift.

AppleScript a Automator jsou funkční, ale jejich budoucnost je nejistá. Apple se zaměřuje na Zkratky, které jsou modernější, ale stále nenabízejí všechny funkce pro pokročilé uživatele.


Návrh a tvorba řešení

Po zvážení možností mě tedy napadlo poměrně zajímavé řešení. Napíšeme AppleScript, který spustíme po přihlášení do systému na pozadí. Script bude každých 30 sekund kontrolovat, zda máme spuštěný proces Capture One 20 (zkratka C1). Pokud ano, tak spustí příslušné Zkratky, ve kterých nastaví True Tone a Night Shift podle požadované situace.

Zkratky

Začneme nejprve aplikací zkratky, kde vytvoříme zkratky pro nastavení True Tone (TT) a Night Shift (NS).

Do všech jsem přidal příkaz na konec, který aplikaci Zkratky zavře, aby nám nezůstala otevřená v Docku (není to však nezbytné).

Z procesní mapy víme, že budeme potřebovat tři zkratky:

1. NS off, TT off (vypnuto, když běží C1)
2. NS off, TT on (pokud ho vypneme a je před 17 hodinou)
3. NS on, TT on (pokud ho vypneme a je po 17 hodině)

AppleScript

Otevřeme Aplikaci Editor Scriptů a do něj vložíme script níže. AppleScript má jednu přednost a to tu, že je to hodně “ukecaný” jazyk, takže jde poměrně dobře číst i bez komentářů. Přidal jsem nicméně do kódu i české komentáře pro lepší pochopení.

Pokud chcete podobný script pro jinou aplikaci, stačí na řádku 10 přepsat name is "" na aplikaci, kterou chcete hlídat.

AppleScript
-- Script pro kontrolu, že běží Capture One 20. 
-- Pokud ano, tak spustí zkratky pro nastavení True tone (TT) a Night Shift (NS)

set appName to "Capture One 20" -- jméno aplikace v System Events
set captureOneRunning to false -- nastavení boolean, když běží C1

repeat
	
	tell application "System Events"
		-- spočítá kolik je procesů s tímto jménem, pokud je větší než 0 nastaví true
		set isRunning to (count of (processes whose name is appName)) > 0
	end tell
	
	if isRunning and captureOneRunning is false then
		-- pokud běží a neběžel už předtím vypně NS a TT
		
		set captureOneRunning to true
		tell application "Shortcuts"
			run shortcut "NS off TT off"
		end tell
		
	else if not isRunning and captureOneRunning is true then
		-- jinak pokud neběží, ale předtím běžel nastaví NS a TT podle času
		
		set currentHour to hours of (current date) -- zjistí aktuální čas
		
		if currentHour  17 then
			tell application "Shortcuts"
				run shortcut "NS on TT on"
			end tell
		else
			tell application "Shortcuts"
				run shortcut "NS off TT on"
			end tell
		end if
		set captureOneRunning to false
		
	end if
	
	delay 30 -- počkej 30 sekund
	
end repeat

Script uložíme. V dialogu vybereme Formát souboru: Script a já jsem vybral ještě možnost Podpis kódu: Podepsat pro lokální spuštění. Uložil jsem si ho do ~/Aplikace/C1Monitor.scpt.

Pokud script ručně spustíme, zjistíme, že již funguje jak má a opakovaně nám po spuštění Capture One vypne True Tone a Night Shift. Po vypnutí nám vše vrátí do původního stavu.

Zbývá nám tedy poslední úkol a to zajistit běh scriptu na pozadí, abychom ho nemuseli pokaždé ručně spouštět. To by nedávalo moc smysl.


Spuštění po startu

Zbývá vyřešit tedy poslední úkol a to je, aby nám automatizace běžela na pozadí po spuštění systému.

Jako nejjednodušší řešení mi přišlo využít služby osascript, který je v macOS již integrovaný. Vytvoření příslušného souboru plist nebude náročné.

Doporučuji nainstalovat program Xcode od Apple, který vám tuto činnost může ještě trochu usnadnit tím, že umí editovat soubory *.plist. Není to však nutné pro tento příklad.

Začal jsem tedy tím, že jsem ve Finder navigoval do složky ~/Knihovna/LaunchAgents.

Pokud nevidíte složku Knihovna doporučuji ve Finder stisknout ⌘ + ⇧ + . pro zobrazení skrytých souborů a složek.

V této složce vytvořte soubor com.mikesh.c1monitor.plist. Můžete si místo mikesh napsat své jméno. Formát souboru byste měli dodržet a určitě musí mít koncovku plist.

Otevřete soubor v Textovém editoru a vložte do něj obsah níže a uložíte. Je potřeba místo mikesh na řádku 10 vložit název své domovské složky uživatele.

XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.mikesh.c1monitor</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/osascript</string>
		<string>/Users/mikesh/Applications/C1monitor.scpt</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>

Lze vyčíst, že konfigurujeme, aby se po startu spustil osascript s naším uloženým skriptem.

Je pravděpodobné, že vám vyskočí systémová notifikace, že máte po spuštění nový program osascript. To můžete potvrdit v nastavení.

Hotovo!

Tímto je naše automatizace připravena k použití!

Nyní můžete Mac restartovat a vyzkoušet, že po spuštění vaší aplikace se spustí příslušné zkratky, které nastaví True Tone a Night Shift.

Závěrem

AppleScript je mocný nástroj a doufejme, že ho Apple bude nadále udržovat a snad i aktualizovat. Pravdou však zůstává, že Apple nevydal už spousty let žádné významné novinky týkající se AppleScriptu, což naznačuje, že se na něj do budoucna nespoléhá jako na primární nástroj pro automatizaci.

Automator historicky fungoval jako most mezi jednoduchými a složitějšími skriptovacími řešeními. Umožňuje spouštění AppleScriptu a Bash skriptů. Nicméně Automator od roku 2021 není aktivně aktualizován a Apple jej postupně vytlačuje ve prospěch Zkratek. Nicméně Zkratkám stále chybí některé pokročilé možnosti, jako je přímý přístup k systémovým procesům nebo podpora komplexních skriptovacích scénářů.

Apple otevřeně podporuje přechod uživatelů z Automatoru na Zkratky. Na macOS Monterey (2021) a novějších verzích jsou Zkratky hlavním doporučovaným nástrojem pro automatizaci, ačkoliv Automator je stále dostupný.


2 komentáře: „Apple kafe: Kombinace Automatoru, Zkratek a AppleScript10 minut čtení

  1. JaKuli avatar
    JaKuli

    Díky, to mě hned inspirovalo udělat podobnou věc pro Lightroom. Také se mi několikrát stalo, že jsem upravoval fotky se zapnutým TrueTone. 🫣

    1. Michal Šára avatar

      Stačí pouze zjistit název procesu (aplikace) a lze to přepsat ve skriptu na řádku 4. Tak snad pomůže! 👍🏻