Node RED a Spotify

Zajímaly mě scénáře, kde mohu pracovat se Spotify. V seznamu pluginů jsem našel nod-red-contrib-spotify a rozhodl jsem se ho vyzkoušet. Je pro začátek - vřele doporučuji číst dokumentaci pluginu - člověk si tím ušetří spoustu hodin pokusů a omylů.

První náročná záležitost je autentizace. V Node Red jsou vidět u modulu k vyplnění tato políčka:

V dokumentaci je napsáno, že nejprve má člověk přejít na tuto stránku: https://developer.spotify.com/dashboard/ . Přihlásit se, jít na nástěnku a vytvořit novou aplikaci a tím získám Client ID a Client secret.

Ještě je důležité kliknout na Edit settings a nastavit Redirect URIs. Url musí být adresa Node RED serveru a musí se za to přidat /spotify-credentials/auth/callback. Nezapomenout, že pokud běží Node RED přes SSL, tak se musí uvést https. Takže například URL bude:

http://192.168.1.20:1880/spotify-credentials/auth/callback

Tím ovšem nemáme hotovo. Znovu se musíme vrátit do Node REDu a vyplnit scopes. Tedy práva, která chci aplikaci povolit - respektive o které žádá. Tady je přehled Authorization Scopes.

Takže do políčka Scopes například doplním toto:

user-read-playback-state
user-modify-playback-state
user-read-currently-playing
app-remote-control
streaming
playlist-read-private
playlist-read-collaborative
playlist-modify-private
playlist-modify-public
user-follow-modify
user-follow-read
user-read-playback-position
user-top-read
user-read-recently-played
user-library-modify
user-library-read

Tím mohu autentizaci úspěšně dokončit.

Přehrávání audia

Původně jsem posílal do nodu Spotify json injecty, dle Spotify API dokumentace. To byl chybný krok a kdybych se tady vrátil hned k dokumentaci pluginu, ušetřil bych více času.

Vyčítání zařízení připojených ke Spotify nebyl problém, ale zavolání funkce Transfer Playback, která způsobuje přenesení audio streamu na konkrétní zařízení vykazovalo pořád chyby.

Po nějakém čase hledání jsem narazil na diskusi, kde je psáno, že do nodu Spotify se má posílat nod funkce, ve které bude následující obsah:

msg.params = [
    ['319827319827391823981732'], /* DeviceIds Array (but it can only handle one device id) */
    { play: true } /* Options Object */
];

To rozbilo moji představu o vstupu jako Json objektech a vrátil jsem se k dokumentaci, kde je na konci napsáno, jak se vstupy mají používat - včetně doporučení o přečtení API description pluginu