04.03.2020 | 19:18
Bilo bi nepošteno HomePod u Hrvatskoj nazvati "poluproizvodom" - jer je bez podrške za Apple Music (i buduće dobre volje korisnika da tu uslugu plaća) sveden samo na "simpatičan zvučnik". O vrijednosti za novac nećemo, ali kada ujutro na "Hey, Siri, play something" Siri uzvrati sa nekom od varijacija fraza na "Your music library is empty", ne želite da se dan po jutru poznaje.
Dobra vijest (po mene) je da me Apple Music i tako ne zanima. Ono što me zanima je da HomePod ujutro, kad mu se obratim, svira radio po mom izboru. U 2020. godini to ne zvuči kao sci-fi želja razmaženog korisnika. Ali se Apple potrudio da bude jednako nemoguće.
Kako "nemoguće" ne ulazi u top 10 mojih omiljenih riječi, zainatio sam se i odlučio pronaći način da to ipak (nekako) radi. Pa, prije nego mi izvjetri (a hoće), pišem ovdje proceduru za sve kojima bi mogla dobro doći.
Od sastojaka su potrebni barem 1 HomePod i 1 Mac koji se može spojiti na HomePod putem AirPlaya. Vegeta nije potrebna. U mojem slučaju radi se o Mac Miniju koji vrti Mojave. Prije nego me netko pita zašto izvodim cijelu zavrzlamu preko HomePoda umjesto da isključim Siri na HomePodu i uključim je na Macu: zato. OK, to smo riješili.
Ideja je jednostavna: na Macu pokrenem iTunes, u njega, u jednu playlistu, dodam streamove različitih radio postaja (koje želim slušati), spojim ga preko AirPlaya na HomePod i kažem HomePodu "Hey Siri, Play". Radi! Kažem Siri da pauzira, stopira ili ušuti. Radi. Kažem da ponovo playa. Radi. Odlično, problem riješen. Mogu na spavanje uz "Hey Siri, turn off after one hour" (kad već ne može sama zaključiti kad sam zaspao - kompromisi, kompromisi...).
Jutro. Ptičice. "Hey Siri, play". "Your music library is empty". Aaaargh!
Da ne opisujem kako smo Siri i ja dugim noćnim razgovorima došli do zaključka u čemu je problem, TL;DR: kad HomePod pauzira/zaustavi playanje u iTunesima ("Hey Siri, stop") AirPlay konekcija (Mac <> HomePod) ostaje aktivna sljedeće 3 minute (uz napomenu da Apple "možda" mijenja ovu vrijednost sa apdejtima HomePodovog OS-a), a u scenariju kada HomePod prekida play na timer (pa makar to bilo sa "Hey Siri, turn off after one second"), konekcija se prekida odmah - tako prekinuta konekcija je vidljiva u iTunesima: AirPlay ikona (koja je plava tijekom aktivne konekcije) ponarančasti. No, boja ikone nije pouzdan indikator jer u prvom scenariju (trenutni stop/pauza) 3 minute nakon što se prekine konekcija - ikona ostane plava. Pa se ti misli što se (zapravo) dogodilo.
Zavrzlamu je moguće riješiti s 3 različite skripte (po cijeni jedne i uz set besplatnih noževa!), odgovarajuće konfiguriranje iTunesa i poštivanje "protokola za laku noć" (u nastavku: PZLN).
Konfiguriranje iTunesa je jednostavno. Kreiramo DVIJE playliste. Ja kao prvu koristim defaultnu "Internet Songs" i u njoj držim odabrane radio postaje - nije bitno kako se zove (playlista), bitno je da su u njoj SAMO radio postaje koje želite slušati odnosno "prebacivati" koristeći voice control HomePoda. Druga playlista se u mom slučaju zove "Silence" i u njoj je SAMO custom generirani wav tišine u trajanju od 10 sekundi, prethodno kreiran u Audacityu i snimljen pod nazivom "silence_10s.wav". Zadnji korak je kliknuti na AirPlay ikonu, ISKLJUČITI "Computer" i UKLJUČITI samo HomePod (u mom slučaju zove se "Living Room" jer ga, pogađate, držim u kuhinji). Ne škodi usputno podesiti željenu "noćnu glasnoću" (za "Living Room").
Spomenuti PZLN podrazumijeva da prije spavanja učitam iTunes i kliknem na radio postaju koju želim slušati dok ne utonem u san. S obzirom da je AirPlay konekcija aktivna dok god iTunesi sviraju, na raspolaganju su mi voice komande tipa "Hey Siri, next song" ili "Hey Siri, shuffle". Apple Music za Nepodržane, here we come!
Sad se moramo pobrinuti da ne puca ljubav između HomePoda i iTunesa kad utihne mala noćna muzika. U tu svrhu utipkamo/kopipejstamo ovo u AppleScript Editor i snimimo kao WakeHomePod.scpt (u mom slučaju u ~/Applications/):
if application "iTunes" is running then
tell application "iTunes"
if player state is not playing then
set newAirplayDevice to (get some AirPlay device whose name is "Living Room")
set current AirPlay devices to {newAirplayDevice}
play track "silence_10s" of playlist "Silence"
delay 5
play track "Laganini FM" of playlist "Internet Songs"
pause
end if
end tell
end if
Gornja skripta prvo provjeri da li je iTunes učitan. Ako nije, znači da nismo ispoštovali PZLN i skripta nas može ignorirati. Ako jesmo, skripta provjeri da li iTunes svira - ako svira, ljubav HomePoda i iTunesa traje pa možemo pustiti golubiće na miru. No, ako je iTunes dignut, ali NE svira, vrijeme je za afrodizijak: prvo identificiramo koji AirPlay "device" nosi ime našeg HomePoda (u mom slučaju "Living Room") i preusmjerimo AirPlay na njega. Na žalost, HomePod ima čvrst san i ovo ga neće probuditi. Probudit će ga tišina (ranije spomenuti "silence_10s.wav") - jer bi sve drugo probudilo nas. Naime, kad budimo HomePod, ne dopušta nam prethodno podesiti glasnoću. Zato playamo 10 sekundi tišine (što je fantastična upotreba zvučnika!), ali prekidamo nakon 5. Čemu razlika? Zato jer HomePodu treba "nekoliko" sekundi da se probudi - nekad jedna, nekad tri, ali (u mojim testovima) nikad više od četiri - pa sam stavio pet jer volim okrugle brojke. Nakon pet sekundi prebacimo track na onaj s kojim se želimo probuditi (besplatna reklama za "Laganini FM"!) i ODMAH pauziramo - to se dovoljno brzo dogodi da HomePod ne uspije ni pisnuti. Sad možemo reći "Hey Siri, play" i - svirat će.
Zapravo neće još - odnosno neće ujutro. Jer je konekcija koju smo upravo uspostavili živa samo 3 minute (nakon što se izvršila pauza).
Zato moramo gornju skriptu pokretati svake tri minute. Ne želimo gornju skriptu pokretati SVAKE 3 minute. Ne želimo nijedan AppleScript pokretati svake 3 minute jer troši CPU kao da ne postoji sutra. Zato nećemo direktno pokretati gornju skriptu nego ćemo pokretati skriptu koja pokreće skriptu. Ovoga puta Bash skriptu koju možemo snimiti (pod imenom WakeHomePod.sh) u isti folder gdje smo prethodno snimili WakeHomePod.scpt:
#!/bin/sh
currenttime=$(date +%H:%M)
if [[ "$currenttime" > "06:00" ]] && [[ "$currenttime" < "11:00" ]]; then
osascript ~/Applications/WakeHomePod.scpt
fi
Bash skripta, svaki put kad je pokrenemo, očita aktualno vrijeme u formatu "00:00" (bez navodnika) i provjeri da li je vrijeme između zadanog (u mom slučaju između 6 i 11 ujutro). Ako je, pozvat će prethodni AppleScript. Zašto tako? Zato jer ne želim da se AppleScript izvršava dok spavam ili nakon što sam već sigurno budan - u to vrijeme Mac izvršava pametnije skripte (čisti kuću, plijevi vrt...).
Sad imamo dvije skripte koje se brinu za ono što treba obaviti i kada to treba obaviti. Ali još se nitko ne brine pokrenuti ikoju od njih. Za to ćemo koristiti launchd, točnije Launch Agents (jer Apple ne voli kad koristimo cron) kojemu ćemo reći da pokreće Bash skriptu svake 3 minute (180 sekundi):
<?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>local.WakeHomePod</string>
<key>Program</key>
<string>~/Applications/WakeHomePod.sh</string>
<key>StartInterval</key>
<integer>180</integer>
</dict>
</plist>
Gornju skriptu snimimo pod imenom local.WakeHomePod.plist u ~/Library/LaunchAgents/. To je neće pokrenuti. Pokrenuo bi je restart računala, ali možemo i bez toga, pješke. Podignemo terminal i tipkamo:
launchctl load ~/Library/LaunchAgents/local.WakeHomePod.plist
Ako želimo provjeriti da li je pokrenuta, možemo utipkati:
launchctl list | grep local
Ako se pojavi u ispisu, pokrenuta je i svakih 180 sekundi pokretat će Bash skriptu (koja će pokretati AppleScript koji će pokretati playanje tišine).
Kad se prvi put izvrše skripte, sistemski Security će (odvojeno) prijaviti da WakeHomePod.sh i Terminal žele kontrolirati iTunes - dopustite im i više neće gnjaviti.
Nakon toga možemo pogasiti terminal i sve editore, pustiti samo iTunes, u njemu željenu radio postaju i otići na zasluženo spavanje. A kad ujutro odlučimo prekinuti cvrkut ptičica sa "Hey Siri, play" i prosvira naš omiljeni jutarnji radio, nećemo se ni sjetiti da u tom trenutku u nekoj drugoj Nepodržanoj državi neki nesretni vlasnik HomePoda koristi isti za kiseljenje kupusa - jer ne zna što bi drugo s njim. Mi znamo.