[Neues Modul] Spotify

Begonnen von neumann, 28 Mai 2017, 15:58:19

Vorheriges Thema - Nächstes Thema

AmunRe

Zitat von: neumann am 01 Juni 2017, 23:25:30
Ah, ich verstehe. Man könnte es darüber lösen eine Playlist zu starten, shuffle zu aktivieren und dann entsprechend zum nächsten Track zu skippen... Würde das funktionieren?


Sag ich dir morgen früh, aber danke für die Idee!
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

Ma_Bo

@Oskar: diese Meldung hatte ich gerade nach einem Neustart von FHEM

2017.06.02 17:50:00.189 1: PERL WARNING: main::Spotify_getTargetDeviceID() called too early to check prototype at ./FHEM/37_Spotify.pm line 674, <$fh> line 13067.
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

neumann

Zitat von: Ma_Bo am 02 Juni 2017, 17:55:54
@Oskar: diese Meldung hatte ich gerade nach einem Neustart von FHEM

2017.06.02 17:50:00.189 1: PERL WARNING: main::Spotify_getTargetDeviceID() called too early to check prototype at ./FHEM/37_Spotify.pm line 674, <$fh> line 13067.

Dankeschön, sollte nun behoben sein :)
LG Oskar
Modulentwickler
- Spotify #72490
- Nello #75127

enrikb

Ich habe mir hier lokal mal angesehen, wie die Spotify Windows Anwendung wohl mein lokales Connect-Gerät, ein ASUS Clique R100, findet. Das R100 sendet - neben den üblichen UPnP / SSDP Media-Gedöns Announcements auch Bonjour. Der PTR RR sieht so aus:


_spotify-connect._tcp.local: type PTR, class IN, Wohnzimmer._spotify-connect._tcp.local


("Wohnzimmer" ist natürlich der Gerätename).

Der Name löst zu einem TXT und SRV RR auf (Auszüge aus dem Wireshark-Dump):


Wohnzimmer._spotify-connect._tcp.local: type SRV, class IN, cache flush, priority 0, weight 0, port 8080, target Qualcomm-Atheros-CUS227-047d43.local
Wohnzimmer._spotify-connect._tcp.local: type TXT, class IN, cache flush
  TXT: VERSION=1.0
  TXT: CPath=/zeroConf


Die Spotify-Anwendung macht dann eine Verbindung auf Port 8080 (vgl. SRV RR) und setzt einen HTTP GET-Request auf /zeroConf?action=getInfo (vgl. TXT RR) ab:


GET /zeroConf?action=getInfo HTTP/1.1
Host: 192.168.128.56:8080
User-Agent: Spotify/105500487 Win32/0 (PC laptop)
Keep-Alive: 0
Connection: keep-alive
Accept-Encoding: gzip
Content-Type: application/x-www-form-urlencoded



Zurück kommt ein JSON-Objekt:


{
  "status": 101,
  "statusString": "OK",
  "spotifyError": 0,
  "version": "2.1.0",
  "deviceID": "255720ef-e852-419f-a2f5-6443905b8cfd",
  "remoteName": "Wohnzimmer",
  "publicKey": "bTBzujQi9/JfWvZZIlhMnFy7MHwzTrHH1DC2B7Xtl3VJhFgZTywLD26VlsrqSv5jO5f6sLgZ01wrotShQpNPJ7varaZ9VJ/7Ch/tHegbeObCCAMMOAQkpWIp0/aPlI/g",
  "activeUser": "enrik.berkhan",
  "accountReq": "PREMIUM",
  "deviceType": "SPEAKER",
  "brandDisplayName": "ASUS",
  "modelDisplayName": "Clique_R100",
  "libraryVersion": "1.20.0-g594175d4"
}


Die interessanten Member sind vermutlich "deviceID" und "publicKey". Keine Ahnung, ob man das im WebAPI irgendwie verwenden kann, aber vielleicht kommt damit jemand weiter. Da mein Account der aktuelle 'activeUser' ist, sehe ich das Gerät zurzeit wohl auch im FHEM Modul. Das ist nicht immer der Fall.

Viel Erfolg,
Enrik

neumann

Hallo Enrik,

vielen Dank für deine Analyse!
Mir ist es auch bereits gelungen, lokale Geräte zu entdecken - man müsste es nur schaffen, das Gerät zu "aktivieren", danach wäre es über die Web API steuerbar.
Dazu benötigt es allerdings blobs & co, von denen ich noch nicht weiß, wie ich sie generieren kann.
Das ganze wurde bereits in go implementiert, man müsste es entsprechend noch in das Modul portieren: https://github.com/badfortrains/spotcontrol

Falls jemand eine Idee hat und helfen mag, sehr gerne!

LG
Oskar
Modulentwickler
- Spotify #72490
- Nello #75127

moonsorrox

Interessehalber möchte ich noch mal nachfragen
Zitat von: neumann am 28 Mai 2017, 15:58:19
Folgende Funktionen sind implementiert (manche benötigen einen Premium Account):
welche benötigen denn keinen Premium Account oder sind damit nur readings gemeint (die ja fast alle erscheinen)

Diese Funktionen hier sind mit webCMD angelegt und es funktioniert keiner davon.
paused toggle next prev volumeUp volumeDown

Ich glaube ich werde mir mal den 3monatigen Testaccount zulegen  ;)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

neumann

Zitat von: moonsorrox am 03 Juni 2017, 13:33:30
Interessehalber möchte ich noch mal nachfragenwelche benötigen denn keinen Premium Account oder sind damit nur readings gemeint (die ja fast alle erscheinen)

Diese Funktionen hier sind mit webCMD angelegt und es funktioniert keiner davon.
paused toggle next prev volumeUp volumeDown

Ich glaube ich werde mir mal den 3monatigen Testaccount zulegen  ;)

Ich habe gerade noch mal nachgelesen, anscheinend sind leider alle steuernden Aktionen Premium only: https://developer.spotify.com/web-api/working-with-connect/

LG
Modulentwickler
- Spotify #72490
- Nello #75127

moonsorrox

Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

enrikb

Hallo Oskar,

danke für den Hinweis auf spotcontrol. Bin schon am Go lesenlernen.

Viele Grüße,
Enrik

accessburn

Hat schon jemand etwas interessantes für FTUI zusammen geschustert?
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Haecksler

Tolles Modul! Funktioniert soweit einwandfrei.
Das einzige was komisch ist, ist dass wenn man mit "playPlaylistByName" ein Mixtape z.B. "Dein Mixtape 1" abspielen will, kommt zwar das Mixtape 1, dass was gespielt wird hat aber nichts mit dem Mixtape, welches in der Spotify App angezeigt wird zutun.
Kann das sonst noch jemand bestätigen?

Gruß,
Stefan

neumann

Hey Stefan!

playPlaylistByName bezieht sich auf alle öffentlichen Spotify Playlists wie z.B. "Top Hits Deutschland" etc.
Generell empfiehlt es sich, immer wenn es möglich ist, alles über die contextURI anzusprechen, da du dann garantiert die richtige Playlist abspielst.

Liebe Grüße
Oskar
Modulentwickler
- Spotify #72490
- Nello #75127

Tomatenjoghurt

Hi!

Erstmal danke für das Modul - es funktioniert wirklich auf Anhieb super!  ;D

Eine Frage...gibt es evtl eine Möglichkeit bestimmte Playlists zu speichern?
Ich hatte mir überlegt Playlists in einem dummy (playlist) als STATE zu speichern...aber dann krieg ichs irgendwie noch nicht hin, den STATE des dummys, der die URi der Playlist enthält, abzuspielen...
Gibt es da irgendeine Möglichkeit?
Quasi...
set Spotify playContextByURI playlist.STATE
...was ja leider nicht geht, da er so nicht den Inhalt der Variable abspielt, sondern den String an sich interpresiert...  ::)

neumann

#73
Hey!
Gerne :)

Klar, das sollte mit Perl Syntax kein Problem sein:
{ fhem("set Spotify playContextByURI ". Value("playlistXY")) }

Meinst du das?

LG
Oskar
Modulentwickler
- Spotify #72490
- Nello #75127

CoolTux

Zitat von: Tomatenjoghurt am 12 Juni 2017, 21:36:42
Hi!

Erstmal danke für das Modul - es funktioniert wirklich auf Anhieb super!  ;D

Eine Frage...gibt es evtl eine Möglichkeit bestimmte Playlists zu speichern?
Ich hatte mir überlegt Playlists in einem dummy (playlist) als STATE zu speichern...aber dann krieg ichs irgendwie noch nicht hin, den STATE des dummys, der die URi der Playlist enthält, abzuspielen...
Gibt es da irgendeine Möglichkeit?
Quasi...
set Spotify playContextByURI playlist.STATE
...was ja leider nicht geht, da er so nicht den Inhalt der Variable abspielt, sondern den String an sich interpresiert...  ::)

Wenn Du einen Dummy anlegst und mit den Attributen setList und readingList arbeitest kannst Du eine spätere Abfrage ganz einfach mit

set Spotify playContextByURI [playlistDummy:playListXY]


das ganze abspielen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net