[Neues Modul] Spotify

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

Vorheriges Thema - Nächstes Thema

rip

Bei mir selbes Problem, genau die wichtigen Funktionen (play/pause/next/volume) gehen nicht mehr :(
Gibt es vielleicht schon Info vom Entwickler ob sich das nach den Spotify Api Änderungen wieder reparieren lässt?

setstate

#166
Im HTTP-Reply kann man den Grund erkennen:
Zitat<p><b>411.</b> <ins>That's an error.</ins>
  <p>POST requests require a <code>Content-length</code> header.

In der 37_Spotify.pm gibt es zwei PUT Aufrufe, die müssen dahingehend angepasst werden, sodass HttpUtils_NonblockingGet auch ein ContentLength in den Header einbaut.

vorher
Spotify_apiRequest($hash, 'me/player/pause', undef, 'PUT', 0);

nachher
Spotify_apiRequest($hash, 'me/player/pause', {}, 'PUT', 0);

vorher
Spotify_apiRequest($hash, 'me/player/play' . (defined $device_id ? "?device_id=$device_id" : ''), undef, 'PUT', 0);

nachher
Spotify_apiRequest($hash, 'me/player/play' . (defined $device_id ? "?device_id=$device_id" : ''), {}, 'PUT', 0);

Ändern, speichern und im FHEM das Spotify-Modul neu laden

reload 37_Spotify

Für Next und Previous noch etwas verdrehter:

Spotify_apiRequest($hash, 'me/player/previous', encode_json {}, 'POST', 0);

Volume Up/Down ging bei mir noch nie, aber wenn man die min / max Funktionen bei der Spotify_volumeStep rausschmeißt

sub Spotify_volumeStep($$$$) {
my ($hash, $direction, $step, $device_id) = @_;
my $name = $hash->{NAME};

$device_id = $step . (defined $device_id ? " ". $device_id : "") if(defined $step && $step !~ /^[0-9]+$/);
$step = $attr{$name}{volumeStep} if(!defined $step || $step !~ /^[0-9]+$/);
$step = 5 if(!defined $step);

my $nextVolume = undef;
if(defined $device_id) {
my @devices = @{$hash->{helper}{devices}};
foreach my $device (@devices) {
if(defined $device->{id} && $device->{id} eq $device_id) {
$nextVolume = $device->{volume_percent} + $step * $direction;
$device->{volume_percent} = $nextVolume;
}
}
} else {
$nextVolume = $hash->{helper}{device_active}{volume_percent} + $step * $direction;
        $hash->{helper}{device_active}{volume_percent} = $nextVolume;
}

return "could not find device" if(!defined $nextVolume);

Spotify_setVolume($hash, 0, $nextVolume, $device_id);

return undef;
}


und einen leeren $data-Parameter ({}) mitschickt, damit HttpUtils_NonblockingGet ein ContentLength in den Header einbaut, klappt auch das

Spotify_apiRequest($hash, "me/player/volume?volume_percent=$volume". (defined $device_id ? "&device_id=$device_id" : ''), {}, 'PUT', $block

rip

Spitze, funktioniert! (nur Volume noch nicht getestet). Danke @setstate!

Anjo1979

Super setstate! Vielen Dank!

Analog dazu noch für Shuffle une Repeat:

Vorher - Shuffle:
Spotify_apiRequest($hash, "me/player/shuffle?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);

Nachher - Shuffle:
Spotify_apiRequest($hash, "me/player/shuffle?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), {}, 'PUT', 0);

Vorher - Repeat:
Spotify_apiRequest($hash, "me/player/repeat?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);

Nachher - Repeat:
Spotify_apiRequest($hash, "me/player/repeat?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), {}, 'PUT', 0);

mrSnatz

Hi,

habe die 37_Spotify.pm entsprechend angepasst aber es gibt bei mir immernoch keine Änderung. Muss ich irgendetwas anderes noch beachten? noch etwas in der HttpUtils.pm oder wegen einer https Verbindung? Bei mir wird nur der Text und das Bild geändert wenn ich etwas von meinen Geräten abspiele. Eine Eingabe über fhem funktioniert aber nicht:((

CoolTux

Das Modul neu laden

reload 37_Spotify.pm

oder FHEM neu starten.
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

mrSnatz

okay Fehler lag bei mir. Hatte die Datei mit dem Editor von Mobaxterm bearbeitet. Nachdem ich es dann via ssh gemacht habe klappt play Pause next und previus allerdings funktioniert das mit lauter und leiser noch nicht. habe wie oben beschrieben die Volume funktion einfach ausgeklammert mit #. und in der apiequest von volume  undef durch {} ersetzt. am ende habe ich $blocking); gelassen da nur block zu einer Fehlermeldung führt.

raxor

Vielen Dank! Klappt!

Nach dem gleichen Schema konnte ich bei mir auch folgende Probleme lösen:

setVolume für meinen volumeFade (Find ich eh besser als VolumeStep was bei mir auch nicht geht)
Vorher
Spotify_apiRequest($hash, "me/player/volume?volume_percent=$volume". (defined $device_id ? "&device_id=$device_id" : ''), undef, 'PUT', $blocking);
Nachher
Spotify_apiRequest($hash, "me/player/volume?volume_percent=$volume". (defined $device_id ? "&device_id=$device_id" : ''), {}, 'PUT', $blocking);

seekToPosition für den Fortschritsbalken
Vorher
Spotify_apiRequest($hash, "me/player/seek?position_ms=$position", undef, 'PUT', 0);
Nachher
Spotify_apiRequest($hash, "me/player/seek?position_ms=$position", {}, 'PUT', 0);


Ranseyer

Danke für den Input. Mir haben diese Hinweise massiv geholfen !

PS: Blöd an der Sache finde ich: Wenn der Source in einem öffentlicheren Sourcecode-Management System liegen würde bräuchtet ihrt nur einen Pull-Request stellen, Oskar könnte die Änderung checken und mit wenif Aufwand übernehmen. (Oder andere die Änderung einfach nachvollziehen)

PPS: Was will ich damit sagen, ich würde sehr cool finden wenn der FHEM-Source etwas zeitgemäßer gemanaged würde, beispielsweise auf Basis der offenen GitLab-Lösung. (Und wer hätte es gedacht, GitLab setzt ja auch GIT auf :-) )
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

neumann

Hey zusammen,

entschuldigt, ich war durch die Arbeit etwas eingespannt und habe das hier nicht so mitbekommen.
Ich habe eure Änderungen mit in das Modul aufgenommen und eingecheckt - könntet ihr kurz überprüfen, ob jetzt alles passt oder ob ich noch was vergessen habe?

Danke!

Lg
Oskar
Modulentwickler
- Spotify #72490
- Nello #75127

Ranseyer

Zitatentschuldigt

Dazu gibt es wohl kaum nen Grund. Danke fürs Beheben !
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

forum-merlin

Hi Oskar!

Danke dass du das Modul geschrieben hast.
Leider habe ich ein paar Problemchen und bin grad nicht sicher ob ich die 10.- EUR zum Fenster rausgeschmissen habe oder nicht.

Ich habe hier ein SONOS System mit so einigen Lautsprechern.
Sonos ist grundsätzlich lauffähig, und ich habe auch meinen Spotify Premium Account in der Sonos App eingetragen.
Ich kann jetzt von der Sonos app aus Spotify triggern, und auch aus der Spotify App heraus.

Ich bin dann so vorgegangen dass ich erst im Developer Dashboard (welches sich inzwischen etwas verändert hat) eine eigene FHEM app angelgt habe, und habe mir die Client ID und das Secret geholt.
Dann habe ich es in FHEM angelegt, und habe die Client ID und das Secret angegeben, und dann habe ich GET Auth URL geklickt, und dann diese im Browser aufgerufen.
(Im übrigen die Redirect URL von https://oskar.pw funktionierte bei mir nicht. Ich habe dann https://oskarneumann.de genommen.)
Dann habe ich das bestätigt, und den Code eingefügt und SET geklickt.

Nach einem Save habe ich dann einen refresh gemacht, und dann in den Readings geschaut.
Leider sehe ich die SONOS Devices nicht.

Ich habe dann mal aus der Spotify App heraus einen Song gestartet, udn dann habe ich das Sonos Device gesehen. Auch was gerade an Lautstärke gesetzt war etc.
Nur steuern aus FHEM heraus ging irgendwie nicht.
Da ich habe mehrere SONOS Speaker habe habe ich dann mal aus der Spotify app noch die anderen Speaker angesteuert, aber das Problem ist, dass ich in FHEM, im Spotify Gerät immer nur einen Player sehe. Nämlich genau den, der in der Spotify App auf dem z.B. Tablet getriggert wurde.
Meinen PC und die darauf laufende Sonos App sehe ich beispielsweise garnicht.

Was ich auch nicht verstehe ist eine error_description "Forbidden."

Fragen:
- sind aus Sicht deines Moduls die anzusprechenden Geräte die Spotify Connect Settings, oder die Geräte?
- stimmt die https://oskar.pw/ redirect URI überhaupt noch?
- warum sehe ich von 4  Sonos playern immer nur den einen den ich von der Tablet Spotify App agehakt hatte?
- was bedeutet der Forbidden error?`


defmod Spotify Spotify e17a873c87xxxxxxxxaef0aaaaa5 bdb46a17121246xxxxxxd9bbbbe7 https://oskarneumann.de/

setstate Spotify playing
setstate Spotify 2018-08-17 13:08:45 .access_token BQCfJlM52UU7XGjxxxxo-8z59OdcxyqtXfJI6BS_CHTddotxxxxxgseWWgQ8-8x1LY9O089yUZHXRxxxxxxxUolOIMvFExeUnWshJVtU5cvONIxxxxxxxxxB2QGXT4AD1uPPY1Oi1d6X6ftJp1XWy_LMaw7P9GeLctmoZZxxxxxxxxxeWTQDuT
setstate Spotify 2018-08-17 13:08:45 .expires 1534507725.81592
setstate Spotify 2018-08-17 13:08:45 .refresh_token AQCHq3lrNixxxxxw-FLjmHZr6_Oqv6JI-CuAdvVwN0ooN9-SND0FSwVz9xxxxxxxxxxpOmx5Spim9QOhex7c3Z-hVGL4eFGfDy0NioxxxxxxxxxxxxxxxxxxxxxxJKRIb98dTBYmE
setstate Spotify 2018-08-17 13:08:46 device_active_id none
setstate Spotify 2018-08-17 13:33:46 device_active_name Keller
setstate Spotify 2018-08-17 13:33:46 device_active_type Speaker
setstate Spotify 2018-08-17 13:33:46 device_active_volume 18
setstate Spotify 2018-08-17 13:08:46 devices_cnt 0
setstate Spotify 2018-08-17 13:12:20 error_code 403
setstate Spotify 2018-08-17 13:12:20 error_description Forbidden.
setstate Spotify 2018-08-17 13:33:46 is_playing 1
setstate Spotify 2018-08-17 13:35:47 progress 00:00:22
setstate Spotify 2018-08-17 13:35:47 progress_ms 22254
setstate Spotify 2018-08-17 13:08:46 repeat off
setstate Spotify 2018-08-17 13:08:46 shuffle off
setstate Spotify 2018-08-17 13:35:27 track_album_cover_large https://i.scdn.co/image/f0b48c9c54cdee56bc28641d75be717fc6f98bd6
setstate Spotify 2018-08-17 13:35:27 track_album_cover_medium https://i.scdn.co/image/124aefdc96c9fa9b40280bd7330f118b461782fa
setstate Spotify 2018-08-17 13:35:27 track_album_cover_small https://i.scdn.co/image/b9625f8ef5e05ee960e1988ca3e50ba03544ec91
setstate Spotify 2018-08-17 13:35:27 track_album_name Take Me Apart
setstate Spotify 2018-08-17 13:35:27 track_album_uri spotify:album:6pw1XPub1bSMq03ASVqRVu
setstate Spotify 2018-08-17 13:35:27 track_artist_name Kelela
setstate Spotify 2018-08-17 13:35:27 track_artist_uri spotify:artist:1U0sIzpRtDkvu1hXXzxh60
setstate Spotify 2018-08-17 13:35:27 track_duration 00:03:38
setstate Spotify 2018-08-17 13:35:27 track_duration_ms 218319
setstate Spotify 2018-08-17 13:35:27 track_name LMK
setstate Spotify 2018-08-17 13:35:27 track_popularity 52
setstate Spotify 2018-08-17 13:35:27 track_uri spotify:track:1D7NJhUyFsFpjIwXMiVO1R
setstate Spotify 2018-08-17 13:08:46 user_country DE
setstate Spotify 2018-08-17 13:08:46 user_follower_cnt 0
setstate Spotify 2018-08-17 13:08:46 user_id xxxxxxxxxxxxxxx
setstate Spotify 2018-08-17 13:31:19 volume 18

FHEM 5.8 auf RasPi3; CULv3-868; RFXtrx433; HM-Sec-SC-2; HM-CFG-LAN; HM-LC-Bl1-FM; HM-CC-RT-DN; HM-ES-PMSw1-Pl; HM-LC-Sw4-DR; Hunter Ventile; 8ch Relais; ENIGMA2; ONKYO_AVR; SONOS; Harmony; telegram; HM-PB-6-WM55; GPIO; HM-Sen-MDIR-O; HM-SEC-SD; HM-LC-Dim1L-Pl-3;

setstate

hier ist auch noch ein Bugfix nötig:

vorher

sub Spotify_isDisabled($) {
my ($hash) = @_;
my $name = $hash->{NAME};
return defined $attr{$name}{disable};
}


nachher

sub Spotify_isDisabled($) {
my ($hash) = @_;
my $name = $hash->{NAME};
return defined $attr{$name}{disable} && $attr{$name}{disable};
}


die Funktion liefert bei disable=0 sonst einen falschen Wert


Außerdem habe ich noch ein

return if(Spotify_isDisabled($hash));

in die Funktion "sub Spotify_dispatch($$$)" gesetzt, damit bei disable=1 jegliche Abfragen gestoppt (=> InternalTimer)

abc2006

Hi,
ich habe noch das Problem, dass wenn ich den Befehl
set spotify playPlaylistbyName Daily Mix 1
absetze, er zwar ein Lied spielt, aber anscheinend nicht aus der Playliste (in Spotify ist erkennbar, dass das Lied nicht in der Liste ist...


Laut Ausgaben des Moduls (verbose 5) ist aber alles i.O.




Gestellte Beispiel:
Playlist "test", inhalt 1(ein) Lied
set spotify playPlaylistbyName test
Spotify spielt "bubbles, in der Playlist ist aber "I Will Remember".


Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

speridal

Erstmal ein ganz großes Dankeschön! für dieses Modul. Läuft auf Anhieb!

Bevor ich jetzt selber damit anfange: Hat jemand schon eine TabletUI - Oberfläche dafür gebaut?