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:
- Client ID
- Client secret
- Scopes
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