Yle Radio Sonos-kaiuttimeen pikanäppäimellä

Aika ajoi ohi vanhasta monihuonekaiutinjärjestelmästä. Samsungin kaiuttimien ohjaamiseen käytettävä sovellus oli jo alkujaan huono ja sen käyttö muuttui ajan kuluessa vain vaikeammaksi. Oli aika uusia äänentoisto.

Uuden järjestelmän vaatimuksia olivat monihuoneominaisuus ja helppokäyttöisyys, joka käytännössä tarkoitti AirPlay-tukea. Aloin olla niin kyllästynyt bluetooth-parituksiin ja katkoksiin.

Ominaisuuksissaan, kuten äänen laadussa ja käytön jouhevuudessa, Sonos on markkinoiden kärkeä. Aiheesta löytyy lukemattomia arvioita Internetin hakukoneilla, joten tuotearviota on tarpeeton toistaa. Sonos-järjestelmä on mainio.

Yleisradio puuttuu Sonos Radiosta

Juuri äskettäin uutena ominaisuutena Sonos on tuonut oman radio-palvelunsa. Palvelusta löytyy lukematon määrä kanavia ympäri maailman. Eräs merkittävä puute siinä kuitenkin on: Yleisradion Radio1. Palvelusta löytyy Ylen Klassinen, mutta ei muita Ylen kanavia. Toiveikkaana kysyinkin, olisiko asiaan mahdollista saada muutosta.

Kuten arvata saattoi, lakoninen vastaus oli, että ei kannata odottaa Ylen kanavia suoraan Sonoksen omaan sovellukseen. Tämä lienee seurausta yleisemmästä muutoksesta, jossa Yle haluaa viedä sisältöjä tiukemmin omiin kanaviinsa. Vuoden 2020 alussa Ylen kanavat poistuivat TuneIn-palvelusta. Tästäkin muutoksesta löytyi tietoa Twitteristä.

Ylen päätöksen taustalla poistaa kanavat TuneIn-palvelusta lienee julkilausutun epämääräisen selittelyn lisäksi Ylen sopimukset ohjelmatuottajien kanssa. Sama ilmiö on ollut Areenan TV-puolen palvelussa, jossa sisällön katselua rajoitetaan käyttäjän sijaintimaan perusteella.

Radio yhdellä painalluksella

Radion voima on ennenkaikkea sujuvuudessa. Naksautat radion napista päälle ja ohjelma alkaa virrata. Jos ohjelma ei ole mieluisaa, naksautat radion toiselle kanavalle tai pois päältä. Nyt, kun Ylen radiokanavia ei löydy Sonoksen palveluista suoraan, tämä ei ole mahdollista.

Airplay tekee äänilähteiden ohjaamisesta Sonoksen kaiuttimiin helppoa, etenkin helpompaa kuin Bluetoothin avulla. Kaiuttimia ei erikseen tarvitse parittaa laitteeseen, vaan äänilähteen saa ohjattua kaiuttimelle muutamalla napautuksella. Muutama napautus on kuitenkin enemmän, kuin mitä radiolta on tottunut odottamaan.

Esimerkiksi iPadilla pitää ensin avata Yle Areenan sovellus. Sitten valitaan audion ja television väliltä audio. Valitaan suorat ja valitaan kanava. Kanava alkaa soida iPadilla. Seuraavaksi valitaan, mihin Airplay-kohteeseen radion äänen halutaan virtaaman.

Olisi tietysti helppoa kuunnella radiota aivan tavallisella radiovastaanottimella. Tilanne asuinpaikassani vain on se, että paksut raudoitetut betoniseinät ja tehokkaasti radioaaltojen etenemistä hidastavat ikkunat haittaavat FM-radion kuuntelua.

Kaapelitelevisioverkossa radiokanavat on ripoteltu niin eriskummallisille taajuuksille, että kanavien löytäminen on lähes toivotonta. Todellinen syy, joka tekee haluttomaksi perinteisen analogiradion käyttöön on kuitenkin se, että kun kerran on tottunut digitaalisen radion äänentoiston laatuun, ei halua palata surisevaan ja särisevään FM-toistoon.

Jos radiokanava löytyisi Sonoksesta, sen voisi valita hyvällä äänenlaadulla kuunnteltavaksi muutamalla painalluksella Sonoksen kontrollerisovelluksen suosikeista. Parhaimmillaan, jos haluttu radiokanava on äskettäin soinut kaiuttimessa, ei tarvitse muuta, kuin hipaista kaiuttimen keskipainiketta ja radiokanava käynnistyy.

Jos radiokanava löytyisi Sonoksesta, sen myös saisi käynnistettyä ajastetusti esim. soimaan oikea-aikaisesti juuri, kun Ykkösaamu alkaa. Järjestelmä toimisi siis näppärästi kelloradion tavoin.

Ratkaisu automaatiosta

Tietokoneet ovat siinä mielessä näppäriä pikku-laitteita, että niitä pystyy ohjelmoimaan saadakseen toivotun asian tehtyä helposti. Mac-tietokoneissa on Automator-ohjelma, jolle voi opettaa tai skriptata toimintoketjuja, eli työnkulkuja. Työnkulku saadaan pikanäppäimen taakse, tai ajastettua. Tällä toiminnolla saa siis täytettyä juuri sen tarpeen, jonka Yleisradion kanavien puute Sonoksessa jättää.

kuvakaappaus Automator-työmkulusta

Kokeilin ensin tehdä työnkulun opettaen hiiren klikkaukset ja näppäimistösyötteen Automatorin “Watch Me Do” -toiminnolla, mutta se osoittautui epäluotettavaksi. Automator vaikuttaa tallentavan esim, missä kohtaa dialogia on painettu hiiren painiketta. Tilanne muuttuu, kun näytön resoluutio muuttuu. Hiiren osoitin ei olekaan samassa paikassa, kuin aiemmin ja painallus ohjautuu väärään paikkaan.

Luotettavampaa oli toteuttaa työnkulku skriptinä. Tällä tavoin toiminnot ovat täsmällisiä ja toistuvat olosuhteista riippumatta samoin joka kerran. Automatorissa käytettävä Apple Script ei ole kaikkien intuitiivisin ohjelmointikieli. Verkosta löytyy hakukone-koodaajalle hyviä vinkkejä, joten skripti syntyi loppujen lopuksi aika pienellä vaivalla. Enemmän vaivaa meni testaamiseen ja hienosäätöön.

Automator-työnkulku

Äänien ohjaus Airplay-kohteeseen

Automaation ensimmäinen osio ohjaa tietokoneen äänet Airplay-kohteeseen. Skripti käyttää syötteenä muuttujaa, jolla ilmaistaan, mihin kaiuttimeen äänet ohjataan. Tarkkaan ottaen ensimmäinen osio taltio muuttujan arvon ja vasta toinen askel on varsinainen skripti.

on run {input, parameters}
	set useSpeaker to (item 1 of input)
	tell application "System Preferences"
		activate
		set current pane to pane id "com.apple.preference.sound"
		delay 1
		tell application "System Events"
			click radio button "Output" of tab group 1 of window "Sound" of application process "System Preferences"
		end tell
		tell application "System Events"
			select (row 1 where value of text field 1 is useSpeaker) of table 1 of scroll area 1 of tab group 1 of window "Sound" of application process "System Preferences"
		end tell
		tell application "System Events"
			keystroke "q" using command down
		end tell
	end tell
end run

Käynnistä selain ja avaa URL

Kolmantena vaiheena avataan selain. Tätä varten Automatorista löytyy oma toiminto, joten koodaamista ei tarvita.

Jotkin Mac:lle toteutetut sovellukset sisältävät valmiita Automator-toimintoja, jotta skriptaamiselta vältytään. Firefoxin URL:n avaava toiminto avaa sivun aina uuteen välilehteen. Tämä ei ole kovin sujuvaa, sillä meillä olisi kohta auki lukemattomia samanlaisia välilehtiä.

Skriptillä simuloidaan näppäimistösyötettä ja syötetään URL päälimmäisenä olevan avoimen välilehden osoitekenttään. Skripti ottaa jälleen syötteenä muuttujan, joka on kaapattu edellisessä vaiheessa. Muuttuja sisältää avattavan URL-osoitteen.

on run {input, parameters}
	tell application "Firefox"
		set OpenUrl to (item 1 of input)
		activate
		delay 1
		set the clipboard to OpenUrl
		tell application "System Events"
			keystroke "l" using {command down}
			keystroke "v" using {command down}
			key code 36 -- return key
		end tell
	end tell
end run

Tähän osioon liittyy pieni jekku. Radiokanavan osoitteen avaaminen Areenasta ei nimittäin käynnistä soittoa automaattisesti. Tätä varten on erillinen sivulla toimiva Tampermonkey-skripti, josta kerron alla. Erillinen skripti aiheuttaa sen, että radiokanava latautuu Areenasta selaimeen ja kanavan soitto käynnistyy.

Aseta äänenvoimakkuus

Sonos vaikuttaa aloittavan äänentoiston sillä voimakkuudella, jolla kaiutinta on edellisen kerran käytetty. Jos ohjelma käynnistyy ajastetusti, voi olla ikävää, että aamulla radiota tuutataan kuuluville samoilla boforeilla, joilla kuunnteltiin toimintaelokuvaa edellisiltana.

Äänenvoimakkuuden säätämiseksi säädylliselle tasolle viimeisenä toimintona asetetaan äänenvoimakkuus tietylle asetukselle.

on run {input, parameters}
	
	set volume 0.5
	
	return input
end run

Tallentaminen pikanäppäimelle

Työnkulku saadaan tallennettua pikanäppäimelle ainoastaan, jos se ei ota vastaan syötettä. On siis asetettava: “Workflow receives”: “no input”, työnkulun asetuksiksi.

kuvakaappaus Automator-työnkulun asetuksista

Kun työnkulku on tallennettu oikeanlaisilla asetuksilla, se ilmaantuu palveluksi MacOs:n työkalupalkkiin käynnistettäväksi. Ensimmäisillä käynnistyskerroilla kysellään kaikenlaisia lupia. Luvat täytyy vielä myöntää erikseen jokaiselle sovellukselle, joka on aktiivisena näytöllä, kun työnkulku käynnistetään.

Pikanäppäimen työnkululle voi asettaa Järjestelmäasetuksissa Näppäimistö-osiossa pikanäppäimien välilehdellä. Kohdasta Yleistä (General) löytyy uusi palvelu, jolle voi ohjelmoida uuden pikanmäppäimen.

Tampermonkey-skripti toiston käynnistämiseen

Areena ei käynnistä toistoa automaattisesti, vaikka radiokanava avattaisiin selaimeen suoralla osoitteella. Kokeilin erilaisia parametrejä osoitteeseen, kuten autoplay=true, mutta näillä ei tuntunut olevan toivottua vaikutusta.

Tampermonkey on yleisimpien selaimien lisäosa, jolla voi suorittaa sivukohtaisia Javascript-toimintoja. Areenassa ohjelman tai radiokanavan sivulla on iso käynnistäpainike, jota klikkaamalla ohjelman toisto aloitetaan. Tätä painiketta voi tietenkin klikata myös ohjelmallisesti.

// ==UserScript==
// @name         Start Playing Yle Radio 1
// @namespace    http://karilaalo.fi/
// @version      0.1
// @description  Start playing a channel when page loads
// @author       Kari Laalo
// @match        https://areena.yle.fi/audio/ohjelmat/57-p89RepWE0
// @grant        none
// ==/UserScript==

var n = 0;
(function() {
    'use strict';

    console.log('running check function first time');
    checkBtnEnabled();
})();

function checkBtnEnabled() {
    console.log('checking if play button is enabled');
    if (!document.getElementsByClassName('PlayButton__StyledPlayButton-sc-13v97uu-0')[0].getAttribute('class').search('enabled') > 0) {
        console.log('play button was not enabled, setting timer | n: ' + n);
        n++;
        if (n < 5) {
            setTimeout(() => {
                checkBtnEnabled();
            }, 2000);
        } else {
            console.log('checked ' + n + ' times, quitting');
        }
        } else {
        console.log('setting timeout to click play button');
        setTimeout(() => {
            console.log('clicking play button');
            document.getElementsByClassName('PlayButton__StyledPlayButton-sc-13v97uu-0')[0].click();
        }, 2000);
    }
}

Kuten skriptistä huomaa, toistopainikkeen tunniste on satunnaiselta vaikuttavan kryptinen. Pelkäsin, että Yle tekee kiusaa ja painikkeen tunniste muuttuu jokaisella sivulatauksella. Näin ei vaikuta kuitenkaan olevan, vaan skripti on nyt toiminut samalla kovakoodatulla tunnistella useamman viikon. On kuitenkin varauduttava siihen, että skriptiä joutuu hienosäätämään, kun Yle muuttaa toteutustaan.

Toistaiseksi skripti toimii ja ohjelma käynnistyy. Lopputuloksena siis pikanäppäin, jolla Yleisradion Radio1:n saa soimaan Sonos-kaiuttimessta yhdellä näppäinyhdistelmällä.

kuvakaappaus automator työnkulun suorituksesta

Sonokselle oma kiertotie

Edellinen Automator-työnkulku edellyttää tietysti Mac-tietokonetta talouteen. Työnkulkua toteuttaessani ja Areenan toteutusta ihmetellessäni satuin huomaamaan, että Areenan web-sovellus itseasiassa vain piilottaa taakseen virtautettavan äänitiedoston, jonka voi ottaa Sonoksessa käyttöön sellaisenaan.

Tämä on todennäköisesti Areena-toteutuksen piirre, jonka Yle haluaisi pysyvän varjoissa. Saa siis nähdä, kuinka kauan toiminto on käytettävissä.

Ylen muuttuneesta TuneIn-käytänteestä on keskustelua tässä Hifi-harrastajien keskusteluketjussa. Virtautettavan äänitiedoston olemassaolosta sainkin itseasiassa vinkin juuri tästä keskustelusta.

Keskustelussa mainittavat linkit kuitenkin ovat erilliseen palvelimeen, kuin mitä Areenan web-sovellus käyttää. On todennäköistä, että ne poistuvat käytöstä enemmin tai myöhemmin. Areenan toteutus tuskin yhtä nopeasti muuttuu.

Areenan toimintaa voi tutkia selaimen kehittäjän työkalujen (developer tools) avulla. Täältä on jokaisen itse poimittavissa osoite, josta kanavan toisto käynnistyy.

kuvakaappaus Areenan sivulta kehittäjän työkaluin

Areenan Web-toteutus siis on vain selaimessa toimiva soitin, joka virtauttaa kanavan toiston aivan samoin, kuin TuneIn tai Sonoksen oma radiopalvelu tekisi.

Asiaan ei oikeastaan liity sen kummempaa dramatiikkaa ja tähän tosiasiaan suhteutettuna Ylen päätös poistaa kanavat toistosovelluksista onkin vähintään kummallinen. Todennäköisesti kyseessä on jälleen enemmän se, miltä asia vaikuttaa asioista päättävien silmissä, kuin se, miten asiat teknisesti todellisuudessa ovat.

Ohjelmavirran osoite siis sijoitetaan Sonoksen sovelluksessa TuneIn-palveluun kohdassa “Omat Radioasemat”. Omat Radioasemat -valikossa valitaan “lisää uusia radioasemia”. Avautuvaan dialogiin syötetään Areenan web-toistosovelluksen käyttämä kanavan virtaustiedoston osoite. Kun oma radiokanava on saatu luotua, se voidaan lisätä Sonoksen suosikiksi.

Ilo on ohimenevää

Kuten Tampermonkey-skriptin kohdalla mainitsin, Ylen toteutuksen osoitteet voivat muuttua. Niin saattaa muuttua myös Ylen kanavien virtaustiedostojen osoitteet etenkin, jos Yle vaihtaa jakeluverkostonsa toimittajaa. Nyt käytettävä Akamain osoite on pysynyt viikkoja ennallaan, mutta osoite saattaa äkisti muuttua ja Sonokseen ohjelmoitu radiokanava lakkaa toimimasta.

Yle saattaa myös haluta rajoittaa ohjelmavirtansa käyttöä ja se voikin jakeluverkoston asettamien rajojen sisällä käyttää tähän erilaisia keinoja, kuten käytetyn toistosovelluksen tunnistamisen. Tällä tavalla Yle voisi rajoittaa toiston ainoastaan omiin sovelluksiinsa tai selaimiin silloin, kun toisto on käynnistetty Ylen omasta osoitteesta.

Useimmat suojauskeinot on osaavien käyttäjien kierrettävissä, kuten nämä tässäkin kuvatut kikat osoittavat. Helpompaa olisi yleispalvelua tuottavalle Yleisradiolle vain yksinkertaisesti asettaa ohjelmansa monikanavaisesti saataville siten, että käyttäjät voisivat suoraan kuunnella niitä omissa laitteissaan ilman ylimääräistä kikkailua.

Ei tässä vielä kaikki

Ehkä enemmän itselleni muistiinpanoksi, kuin asiaan varsinaisesti mitenkään liittyen kirjaan vielä ylös tässä artikkelissa käytetyn ruudulta kuvakaapatun videon muuntamisen GIF-animaatioksi. Sehän tapahtuu helposti ffmpeg-ohjelmalla.

brew install ffmpeg
ffmpeg -i Desktop/automator-yle-radio-1-launched.mp4 \
    -r 15 -ss 00:00:02 -vf scale=914:1080 \
    Desktop/automator-yle-radio-1-launched.gif
Takaisin