mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-28 21:14:52 +00:00
37_Spotify: bugfix, added disable
git-svn-id: https://svn.fhem.de/fhem/trunk@14420 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
42713085a0
commit
661b107a68
@ -26,7 +26,7 @@ sub Spotify_Initialize($) {
|
|||||||
$hash->{SetFn} = 'Spotify_Set';
|
$hash->{SetFn} = 'Spotify_Set';
|
||||||
$hash->{GetFn} = 'Spotify_Get';
|
$hash->{GetFn} = 'Spotify_Get';
|
||||||
#$hash->{AttrFn} = "Spotify_Attr";
|
#$hash->{AttrFn} = "Spotify_Attr";
|
||||||
$hash->{AttrList} = 'defaultPlaybackDeviceID alwaysStartOnDefaultDevice:0,1 updateInterval updateIntervalWhilePlaying ';
|
$hash->{AttrList} = 'defaultPlaybackDeviceID alwaysStartOnDefaultDevice:0,1 updateInterval updateIntervalWhilePlaying disable:0,1 ';
|
||||||
$hash->{AttrList} .= $readingFnAttributes;
|
$hash->{AttrList} .= $readingFnAttributes;
|
||||||
$hash->{NOTIFYDEV} = "global";
|
$hash->{NOTIFYDEV} = "global";
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ sub Spotify_loadInternals($) {
|
|||||||
my $pollInterval = $attr{$name}{pollInterval};
|
my $pollInterval = $attr{$name}{pollInterval};
|
||||||
$attr{$name}{webCmd} = 'toggle:next:prev' if(!defined $attr{$name}{webCmd});
|
$attr{$name}{webCmd} = 'toggle:next:prev' if(!defined $attr{$name}{webCmd});
|
||||||
|
|
||||||
Spotify_poll($hash) if(defined $hash->{helper}{refresh_token});
|
Spotify_poll($hash) if(defined $hash->{helper}{refresh_token} && !Spotify_isDisabled($hash));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ sub Spotify_pausePlayback($) { # pause playback
|
|||||||
$hash->{helper}{is_playing} = 0;
|
$hash->{helper}{is_playing} = 0;
|
||||||
readingsSingleUpdate($hash, 'is_playing', 0, 1);
|
readingsSingleUpdate($hash, 'is_playing', 0, 1);
|
||||||
Spotify_apiRequest($hash, 'me/player/pause', undef, 'PUT', 0);
|
Spotify_apiRequest($hash, 'me/player/pause', undef, 'PUT', 0);
|
||||||
Log3 $name, 3, "$name: pause";
|
Log3 $name, 4, "$name: pause";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ sub Spotify_resumePlayback($) { # resume playback
|
|||||||
$hash->{helper}{is_playing} = 1;
|
$hash->{helper}{is_playing} = 1;
|
||||||
readingsSingleUpdate($hash, 'is_playing', 1, 1);
|
readingsSingleUpdate($hash, 'is_playing', 1, 1);
|
||||||
Spotify_apiRequest($hash, 'me/player/play', undef, 'PUT', 0);
|
Spotify_apiRequest($hash, 'me/player/play', undef, 'PUT', 0);
|
||||||
Log3 $name, 3, "$name: resume";
|
Log3 $name, 4, "$name: resume";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ sub Spotify_setVolume($$$$) { # set the volume
|
|||||||
|
|
||||||
$device_id = Spotify_getTargetDeviceID($hash, $device_id, 0); # resolve target device id
|
$device_id = Spotify_getTargetDeviceID($hash, $device_id, 0); # resolve target device id
|
||||||
Spotify_apiRequest($hash, "me/player/volume?volume_percent=$volume". (defined $device_id ? "&device_id=$device_id" : ''), undef, 'PUT', $blocking);
|
Spotify_apiRequest($hash, "me/player/volume?volume_percent=$volume". (defined $device_id ? "&device_id=$device_id" : ''), undef, 'PUT', $blocking);
|
||||||
Log3 $name, 3, "$name: volume $volume" if(!defined $hash->{helper}{fading});
|
Log3 $name, 4, "$name: volume $volume" if(!defined $hash->{helper}{fading});
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,7 +361,7 @@ sub Spotify_skipToNext($) { # skip to next track
|
|||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
Spotify_apiRequest($hash, 'me/player/next', undef, 'POST', 0);
|
Spotify_apiRequest($hash, 'me/player/next', undef, 'POST', 0);
|
||||||
Log3 $name, 3, "$name: skipToNext";
|
Log3 $name, 4, "$name: skipToNext";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,7 +369,7 @@ sub Spotify_skipToPrevious($) { # skip to previous track
|
|||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
Spotify_apiRequest($hash, 'me/player/previous', undef, 'POST', 0);
|
Spotify_apiRequest($hash, 'me/player/previous', undef, 'POST', 0);
|
||||||
Log3 $name, 3, "$name: skipToPrevious";
|
Log3 $name, 4, "$name: skipToPrevious";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +391,7 @@ sub Spotify_setRepeat($$) { # set the repeat mode
|
|||||||
$mode = 'context' if($mode eq 'all');
|
$mode = 'context' if($mode eq 'all');
|
||||||
my $device_id = Spotify_getTargetDeviceID($hash, undef, 0);
|
my $device_id = Spotify_getTargetDeviceID($hash, undef, 0);
|
||||||
Spotify_apiRequest($hash, "me/player/repeat?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);
|
Spotify_apiRequest($hash, "me/player/repeat?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);
|
||||||
Log3 $name, 3, "$name: repeat $mode";
|
Log3 $name, 4, "$name: repeat $mode";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,7 +402,7 @@ sub Spotify_setShuffle($$) { # set the shuffle mode
|
|||||||
$mode = $mode eq 'on' ? 'true' : 'false';
|
$mode = $mode eq 'on' ? 'true' : 'false';
|
||||||
my $device_id = Spotify_getTargetDeviceID($hash, undef, 0);
|
my $device_id = Spotify_getTargetDeviceID($hash, undef, 0);
|
||||||
Spotify_apiRequest($hash, "me/player/shuffle?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);
|
Spotify_apiRequest($hash, "me/player/shuffle?state=$mode". (defined $device_id ? "&device_id=$device_id" : ""), undef, 'PUT', 0);
|
||||||
Log3 $name, 3, "$name: shuffle $mode";
|
Log3 $name, 4, "$name: shuffle $mode";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -429,7 +429,7 @@ sub Spotify_playTrackByURI($$$) { # play a track by its uri
|
|||||||
my ($hash, $uris, $device_id) = @_;
|
my ($hash, $uris, $device_id) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
return 'wrong syntax: set <name> playTrackByURI <track_uri> ... [ <device_id> ]' if(@{$uris} < 1);
|
return 'wrong syntax: set <name> playTrackByURI <track_uri> ... [ <device_id> ]' if(@{$uris} < 1);
|
||||||
Log3 $name, 3, "$name: track". (@{$uris} > 1 ? "s" : "")." ". join(" ", @{$uris}) if(!defined $hash->{helper}{skipTrackLog});
|
Log3 $name, 4, "$name: track". (@{$uris} > 1 ? "s" : "")." ". join(" ", @{$uris}) if(!defined $hash->{helper}{skipTrackLog});
|
||||||
delete $hash->{helper}{skipTrackLog} if(defined $hash->{helper}{skipTrackLog});
|
delete $hash->{helper}{skipTrackLog} if(defined $hash->{helper}{skipTrackLog});
|
||||||
return Spotify_play($hash, $uris, undef, undef, $device_id);
|
return Spotify_play($hash, $uris, undef, undef, $device_id);
|
||||||
}
|
}
|
||||||
@ -495,7 +495,7 @@ sub Spotify_playArtistByName($$) { # play an artist by its name using search
|
|||||||
return 'could not find artist' if(!defined $result);
|
return 'could not find artist' if(!defined $result);
|
||||||
|
|
||||||
Spotify_playContextByURI($hash, $result->{uri}, undef, $device_id);
|
Spotify_playContextByURI($hash, $result->{uri}, undef, $device_id);
|
||||||
Log3 $name, 3, "$name: artist $result->{uri} ($result->{name})";
|
Log3 $name, 4, "$name: artist $result->{uri} ($result->{name})";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,7 +509,7 @@ sub Spotify_playPlaylistByName($$) { # play a playlist by its name
|
|||||||
return 'could not find playlist' if(!defined $result);
|
return 'could not find playlist' if(!defined $result);
|
||||||
|
|
||||||
Spotify_playContextByURI($hash, $result->{uri}, undef, undef);
|
Spotify_playContextByURI($hash, $result->{uri}, undef, undef);
|
||||||
Log3 $name, 3, "$name: $result->{uri} ($result->{name})";
|
Log3 $name, 4, "$name: $result->{uri} ($result->{name})";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,7 +528,7 @@ sub Spotify_playSavedTracks($$$) { # play users saved tracks
|
|||||||
shift @uris for 1..($first%50-1); # removing first elements users wants to skip
|
shift @uris for 1..($first%50-1); # removing first elements users wants to skip
|
||||||
Spotify_playTrackByURI($hash, \@uris, $device_id); # play them
|
Spotify_playTrackByURI($hash, \@uris, $device_id); # play them
|
||||||
|
|
||||||
Log3 $name, 3, "$name: saved tracks";
|
Log3 $name, 4, "$name: saved tracks";
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -553,7 +553,7 @@ sub Spotify_playRandomTrackFromPlaylistByURI($$$$) { # select a random track fro
|
|||||||
my @uris = ($selectedTrack->{uri});
|
my @uris = ($selectedTrack->{uri});
|
||||||
$hash->{helper}{skipTrackLog} = 1;
|
$hash->{helper}{skipTrackLog} = 1;
|
||||||
Spotify_playTrackByURI($hash, \@uris, $device_id);
|
Spotify_playTrackByURI($hash, \@uris, $device_id);
|
||||||
Log3 $name, 3, "$name: random track $selectedTrack->{uri} ($selectedTrack->{name}) from $uri";
|
Log3 $name, 4, "$name: random track $selectedTrack->{uri} ($selectedTrack->{name}) from $uri";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,7 +611,7 @@ sub Spotify_volumeFade($$$$$) { # fade the volume of a device
|
|||||||
sub Spotify_togglePlayback($) { # toggle playback (pause if active, resume otherwise)
|
sub Spotify_togglePlayback($) { # toggle playback (pause if active, resume otherwise)
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
Log3 $name, 3, "$name: togglePlayback";
|
Log3 $name, 4, "$name: togglePlayback";
|
||||||
|
|
||||||
if($hash->{helper}{is_playing}) {
|
if($hash->{helper}{is_playing}) {
|
||||||
Spotify_pausePlayback($hash);
|
Spotify_pausePlayback($hash);
|
||||||
@ -629,7 +629,7 @@ sub Spotify_getTargetDeviceID($$$) { # resolve target device settings
|
|||||||
|
|
||||||
if(defined $device_id) { # use device id given by user
|
if(defined $device_id) { # use device id given by user
|
||||||
foreach my $device (@{$hash->{helper}{devices}}) {
|
foreach my $device (@{$hash->{helper}{devices}}) {
|
||||||
return $device->{id} if($device->{id} eq $device_id || lc($device->{name}) eq lc($device_id)); # resolve name to / verify device_id
|
return $device->{id} if((defined $device->{id} && $device->{id} eq $device_id) || (defined $device->{name} && lc($device->{name}) eq lc($device_id))); # resolve name to / verify device_id
|
||||||
}
|
}
|
||||||
|
|
||||||
# if not verified, continue to look for target device
|
# if not verified, continue to look for target device
|
||||||
@ -771,23 +771,19 @@ sub Spotify_dispatch($$$) {
|
|||||||
|
|
||||||
my $index = 1;
|
my $index = 1;
|
||||||
foreach my $device (@{$hash->{helper}{devices}}) {
|
foreach my $device (@{$hash->{helper}{devices}}) {
|
||||||
foreach my $prefix (("device_". $index ."_", 'device_active_')) {
|
Spotify_saveDevice($hash, $device, "device_". $index, 0);
|
||||||
if($prefix ne 'device_active_' || $device->{is_active}) {
|
|
||||||
readingsBulkUpdateIfChanged($hash, $prefix . 'id', $device->{id}, 1);
|
if($device->{is_active}) {
|
||||||
readingsBulkUpdateIfChanged($hash, $prefix . 'name', $device->{name}, 1);
|
Spotify_saveDevice($hash, $device, "device_active", 0);
|
||||||
readingsBulkUpdateIfChanged($hash, $prefix . 'type', $device->{type}, 1);
|
$hash->{helper}{device_active} = $device; # found active device
|
||||||
readingsBulkUpdateIfChanged($hash, $prefix . 'volume', $device->{volume_percent}, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash->{helper}{device_active} = $device if($device->{is_active}); # found active device
|
|
||||||
$hash->{helper}{device_default} = $device if(defined $attr{$name}{defaultPlaybackDeviceID} && $device->{id} eq $attr{$name}{defaultPlaybackDeviceID}); # found users default device
|
$hash->{helper}{device_default} = $device if(defined $attr{$name}{defaultPlaybackDeviceID} && $device->{id} eq $attr{$name}{defaultPlaybackDeviceID}); # found users default device
|
||||||
$index++;
|
$index++;
|
||||||
}
|
}
|
||||||
readingsBulkUpdateIfChanged($hash, 'devices_cnt', $index-1, 1);
|
readingsBulkUpdateIfChanged($hash, 'devices_cnt', $index-1, 1);
|
||||||
|
Spotify_saveDevice($hash, {id => "none", "name" => "none", "volume_percent" => -1, "type" => "none"}, 'device_active', 0);
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
|
|
||||||
CommandDeleteReading(undef, "$name device_acitve_.*") if(!defined $hash->{helper}{device_active});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($path eq 'me/player') {
|
if($path eq 'me/player') {
|
||||||
@ -798,7 +794,7 @@ sub Spotify_dispatch($$$) {
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash->{helper}{is_playing} = $json->{is_playing} ne 'false';
|
$hash->{helper}{is_playing} = $json->{is_playing};
|
||||||
$hash->{helper}{repeat} = $json->{repeat_state} eq 'track' ? 'one' : ($json->{repeat_state} eq 'context' ? 'all' : 'off');
|
$hash->{helper}{repeat} = $json->{repeat_state} eq 'track' ? 'one' : ($json->{repeat_state} eq 'context' ? 'all' : 'off');
|
||||||
$hash->{helper}{shuffle} = $json->{shuffle_state};
|
$hash->{helper}{shuffle} = $json->{shuffle_state};
|
||||||
$hash->{helper}{progress_ms} = $json->{progress_ms};
|
$hash->{helper}{progress_ms} = $json->{progress_ms};
|
||||||
@ -867,6 +863,7 @@ sub Spotify_dispatch($$$) {
|
|||||||
sub Spotify_poll($) {
|
sub Spotify_poll($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
return if(Spotify_isDisabled($hash));
|
||||||
|
|
||||||
my $pollInterval = $attr{$name}{updateInterval};
|
my $pollInterval = $attr{$name}{updateInterval};
|
||||||
InternalTimer(gettimeofday()+(defined $pollInterval ? $pollInterval : 5*60), "Spotify_poll", $hash);
|
InternalTimer(gettimeofday()+(defined $pollInterval ? $pollInterval : 5*60), "Spotify_poll", $hash);
|
||||||
@ -914,6 +911,22 @@ sub Spotify_saveArtist($$$$) { # save an artist object to the readings
|
|||||||
readingsEndUpdate($hash, 1) if($beginUpdate);
|
readingsEndUpdate($hash, 1) if($beginUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub Spotify_saveDevice($$$$) {
|
||||||
|
my ($hash, $device, $prefix, $beginUpdate) = @_;
|
||||||
|
readingsBeginUpdate($hash) if($beginUpdate);
|
||||||
|
readingsBulkUpdateIfChanged($hash, $prefix . '_id', $device->{id}, 1);
|
||||||
|
readingsBulkUpdateIfChanged($hash, $prefix . '_name', $device->{name}, 1);
|
||||||
|
readingsBulkUpdateIfChanged($hash, $prefix . '_type', $device->{type}, 1);
|
||||||
|
readingsBulkUpdateIfChanged($hash, $prefix . '_volume', $device->{volume_percent}, 1);
|
||||||
|
readingsEndUpdate($hash, 1) if($beginUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Spotify_isDisabled($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
return defined $attr{$name}{disable};
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@ -1056,6 +1069,11 @@ sub Spotify_saveArtist($$$$) { # save an artist object to the readings
|
|||||||
<i>defaultPlaybackDeviceID</i><br>
|
<i>defaultPlaybackDeviceID</i><br>
|
||||||
the prefered device by its id<br>
|
the prefered device by its id<br>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i>disable</i><br>
|
||||||
|
disables the device<br>
|
||||||
|
default: 0
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i>updateInterval</i><br>
|
<i>updateInterval</i><br>
|
||||||
the interval to update your playback status while no music is running (in seconds)<br>
|
the interval to update your playback status while no music is running (in seconds)<br>
|
||||||
@ -1206,6 +1224,11 @@ sub Spotify_saveArtist($$$$) { # save an artist object to the readings
|
|||||||
<i>defaultPlaybackDeviceID</i><br>
|
<i>defaultPlaybackDeviceID</i><br>
|
||||||
das Standard-Gerät nach ID<br>
|
das Standard-Gerät nach ID<br>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i>disable</i><br>
|
||||||
|
deaktiviert das Gerät<br>
|
||||||
|
default: 0
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i>updateInterval</i><br>
|
<i>updateInterval</i><br>
|
||||||
Intervall in Sekunden, in dem der Status aktualisiert wird, wenn keine Musik läuft<br>
|
Intervall in Sekunden, in dem der Status aktualisiert wird, wenn keine Musik läuft<br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user