From 51e4b7b2393e62fd6e2915481b27e4b19ff6fead Mon Sep 17 00:00:00 2001 From: rleins Date: Tue, 15 Dec 2015 12:16:04 +0000 Subject: [PATCH] SONOS: Added RepeatOne and DeleteFromQueue, fixed a bug according to the fieldType-Reading git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@10179 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_SONOS.pm | 145 +++++++++++++++++++++++++++++------- fhem/FHEM/21_SONOSPLAYER.pm | 49 ++++++++++-- 2 files changed, 161 insertions(+), 33 deletions(-) diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index aff73f478..be13ddbec 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -49,6 +49,10 @@ # Cover von Amazon funktionieren nicht # # SVN-History: +# 15.12.2015 +# Es gibt eine neue Funktionalität an den Sonosplayern: Repeat für einen einzelnen Titel. Durch diese Umstellung wurde der Repeat-Zustand nicht korrekt erkannt. Dafür gibt es jetzt noch einen zusätzlichen Setter und ein zusätzliches Reading: "RepeatOne". +# Es gibt eine neue Funktion "DeleteFromQueue", die Titel aus der aktuellen Abspielliste entfernen kann. Angegeben wird der Index des Elements / der Elemente. +# Das Reading "fieldType" wurde nicht ordnungsgemäß auf Leer gesetzt, wenn du Gruppierung aufgelöst wurde. # 08.12.2015 # Bei der Erkennung von Streams beim Restore von PlayURITemp wurde ein neues Format nicht berücksichtigt. # Bei der Verwendung von "set Sonos Groups Reset" tauchte eine Fehlermeldung wegen eines Leerstrings auf. @@ -74,9 +78,6 @@ # 02.08.2015 # uri_escape() umgestellt, sodass auch UTF8-Sonderzeichen übersetzt werden # Google-Translator-URL parametrisiert und um die mittlerweile notwendigen Parameter 'client=t' und 'prev=input' erweitert -# 12.07.2015 -# Es gibt zwei neue Setter "GroupVolumeU" und "GroupVolumeD", um die Gruppenlautstärke um 'VolumeStep'-Einheiten zu erhöhen oder zu verringern. -# Innerhalb des SubProzesses wurden die Devicenamen der bereits in Fhem definierten Player nicht korrekt verwendet. Das machte sich erst mit dem neuen Feature Bookmarks bemerkbar. # ######################################################################################## # @@ -1216,6 +1217,7 @@ sub SONOS_Read($) { SONOS_readingsBulkUpdateIfChanged($hash, "transportState", $current{TransportState}); SONOS_readingsBulkUpdateIfChanged($hash, "Shuffle", $current{Shuffle}); SONOS_readingsBulkUpdateIfChanged($hash, "Repeat", $current{Repeat}); + SONOS_readingsBulkUpdateIfChanged($hash, "RepeatOne", $current{RepeatOne}); SONOS_readingsBulkUpdateIfChanged($hash, "CrossfadeMode", $current{CrossfadeMode}); SONOS_readingsBulkUpdateIfChanged($hash, "SleepTimer", $current{SleepTimer}); SONOS_readingsBulkUpdateIfChanged($hash, "AlarmRunning", $current{AlarmRunning}); @@ -2394,22 +2396,16 @@ sub SONOS_Discover() { if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { my $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); + my ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); - my $shuffle = $result eq 'SHUFFLE' || $result eq 'SHUFFLE_NOREPEAT'; - my $repeat = $result eq 'SHUFFLE' || $result eq 'REPEAT_ALL'; + $value1 = !$shuffle if (!defined($value1)); - $value1 = !$shuffle if (!$value1); - - my $newMode = 'NORMAL'; - $newMode = 'SHUFFLE' if ($value1 && $repeat); - $newMode = 'SHUFFLE_NOREPEAT' if ($value1 && !$repeat); - $newMode = 'REPEAT_ALL' if (!$value1 && $repeat); - - $SONOS_AVTransportControlProxy{$udn}->SetPlayMode(0, $newMode); + $SONOS_AVTransportControlProxy{$udn}->SetPlayMode(0, SONOS_GetShuffleRepeatString($value1, $repeat, $repeatOne)); # Wert wieder abholen, um das wahre Ergebnis anzeigen zu können $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); - SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($result eq 'SHUFFLE' || $result eq 'SHUFFLE_NOREPEAT')); + ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($shuffle)); } } elsif ($workType eq 'setRepeat') { my $value1 = undef; @@ -2420,22 +2416,36 @@ sub SONOS_Discover() { if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { my $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); + my ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); - my $shuffle = $result eq 'SHUFFLE' || $result eq 'SHUFFLE_NOREPEAT'; - my $repeat = $result eq 'SHUFFLE' || $result eq 'REPEAT_ALL'; + $value1 = !$repeat if (!defined($value1)); - $value1 = !$repeat if (!$value1); - - my $newMode = 'NORMAL'; - $newMode = 'SHUFFLE' if ($value1 && $shuffle); - $newMode = 'SHUFFLE_NOREPEAT' if (!$value1 && $shuffle); - $newMode = 'REPEAT_ALL' if ($value1 && !$shuffle); - - $SONOS_AVTransportControlProxy{$udn}->SetPlayMode(0, $newMode); + $SONOS_AVTransportControlProxy{$udn}->SetPlayMode(0, SONOS_GetShuffleRepeatString($shuffle, $value1, $repeatOne && !$value1)); # Wert wieder abholen, um das wahre Ergebnis anzeigen zu können $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); - SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($result eq 'SHUFFLE' || $result eq 'REPEAT_ALL')); + ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($repeat)); + } + } elsif ($workType eq 'setRepeatOne') { + my $value1 = undef; + + if ($params[0] ne '~~') { + $value1 = SONOS_ConvertWordToNum($params[0]); + } + + if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { + my $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); + my ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); + + $value1 = !$repeatOne if (!defined($value1)); + + $SONOS_AVTransportControlProxy{$udn}->SetPlayMode(0, SONOS_GetShuffleRepeatString($shuffle, $repeat && !$value1, $value1)); + + # Wert wieder abholen, um das wahre Ergebnis anzeigen zu können + $result = $SONOS_AVTransportControlProxy{$udn}->GetTransportSettings(0)->getValue('PlayMode'); + ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($result); + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($repeatOne)); } } elsif ($workType eq 'setCrossfadeMode') { my $value1 = SONOS_ConvertWordToNum($params[0]); @@ -3353,6 +3363,31 @@ sub SONOS_Discover() { } } } + } elsif ($workType eq 'deleteFromQueue') { + $params[0] = uri_unescape($params[0]); + + # Simple Check... + if ($params[0] !~ m/^[\.\,\d]*$/) { + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': Parameter Error: '.$params[0]); + return; + } + my @elemList = sort { $a <=> $b } SONOS_DeleteDoublettes(eval('('.$params[0].')')); + SONOS_Log undef, 5, 'DeleteFromQueue: Index-Liste: '.Dumper(\@elemList); + + if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn}) && SONOS_CheckProxyObject($udn, $SONOS_ContentDirectoryControlProxy{$udn})) { + # Maximale Indizies bestimmen + my $maxElems = $SONOS_ContentDirectoryControlProxy{$udn}->Browse('Q:0', 'BrowseDirectChildren', '', 0, 0, '')->getValue('TotalMatches'); + + my $deleteCounter = 0; + foreach my $elem (@elemList) { + if (($elem > 0) && ($elem <= $maxElems)) { + $deleteCounter++ if ($SONOS_AVTransportControlProxy{$udn}->RemoveTrackFromQueue(0, 'Q:0/'.($elem - $deleteCounter), 0)->isSuccessful()); + } + } + + $maxElems = $SONOS_ContentDirectoryControlProxy{$udn}->Browse('Q:0', 'BrowseDirectChildren', '', 0, 0, '')->getValue('TotalMatches'); + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': Deleted '.$deleteCounter.' elems. In list are now '.$maxElems.' elems.'); + } } elsif ($workType eq 'deletePlaylist') { my $regSearch = ($params[0] =~ m/^ *\/(.*)\/ *$/); my $playlistName = $1 if ($regSearch); @@ -3817,6 +3852,52 @@ sub SONOS_Fisher_Yates_Shuffle($) { } } +######################################################################################## +# +# SONOS_GetShuffleRepeatStates - Retreives the information according shuffle and repeat +# +######################################################################################## +sub SONOS_GetShuffleRepeatStates($) { + my ($data) = @_; + + my $shuffle = $data =~ m/SHUFFLE/; + my $repeat = $data eq 'SHUFFLE' || $data eq 'REPEAT_ALL'; + my $repeatOne = $data =~ m/REPEAT_ONE/; + + return ($shuffle, $repeat, $repeatOne); +} + +######################################################################################## +# +# SONOS_GetShuffleRepeatString - Generates the information string according shuffle and repeat +# +######################################################################################## +sub SONOS_GetShuffleRepeatString($$$) { + my ($shuffle, $repeat, $repeatOne) = @_; + + my $newMode = 'NORMAL'; + $newMode = 'SHUFFLE' if ($shuffle && $repeat && $repeatOne); + $newMode = 'SHUFFLE' if ($shuffle && $repeat && !$repeatOne); + $newMode = 'SHUFFLE_REPEAT_ONE' if ($shuffle && !$repeat && $repeatOne); + $newMode = 'SHUFFLE_NOREPEAT' if ($shuffle && !$repeat && !$repeatOne); + + $newMode = 'REPEAT_ALL' if (!$shuffle && $repeat && $repeatOne); + $newMode = 'REPEAT_ALL' if (!$shuffle && $repeat && !$repeatOne); + $newMode = 'REPEAT_ONE' if (!$shuffle && !$repeat && $repeatOne); + $newMode = 'NORMAL' if (!$shuffle && !$repeat && !$repeatOne); + + return $newMode; +} + +######################################################################################## +# +# SONOS_DeleteDoublettes - Deletes duplicate entries in the given array +# +######################################################################################## +sub SONOS_DeleteDoublettes{ + return keys %{{ map { $_ => 1 } @_ }}; +} + ######################################################################################## # # SONOS_Trim - Trim the given string @@ -5588,6 +5669,7 @@ sub SONOS_GetReadingsToCurrentHash($$) { $current{TransportState} = 'ERROR'; $current{Shuffle} = 0; $current{Repeat} = 0; + $current{RepeatOne} = 0; $current{CrossfadeMode} = 0; $current{NumberOfTracks} = ''; $current{Track} = ''; @@ -5626,6 +5708,7 @@ sub SONOS_GetReadingsToCurrentHash($$) { $current{TransportState} = ReadingsVal($name, 'transportState', 'ERROR'); $current{Shuffle} = ReadingsVal($name, 'Shuffle', 0); $current{Repeat} = ReadingsVal($name, 'Repeat', 0); + $current{RepeatOne} = ReadingsVal($name, 'RepeatOne', 0); $current{CrossfadeMode} = ReadingsVal($name, 'CrossfadeMode', 0); $current{NumberOfTracks} = ReadingsVal($name, 'numberOfTracks', ''); $current{Track} = ReadingsVal($name, 'currentTrack', ''); @@ -5840,8 +5923,10 @@ sub SONOS_ServiceCallback($$) { # PlayMode ermitteln my $currentPlayMode = 'NORMAL'; $currentPlayMode = $1 if ($properties{LastChangeDecoded} =~ m//i); - SONOS_Client_Notifier('SetCurrent:Shuffle:1') if ($currentPlayMode eq 'SHUFFLE' || $currentPlayMode eq 'SHUFFLE_NOREPEAT'); - SONOS_Client_Notifier('SetCurrent:Repeat:1') if ($currentPlayMode eq 'SHUFFLE' || $currentPlayMode eq 'REPEAT_ALL'); + my ($shuffle, $repeat, $repeatOne) = SONOS_GetShuffleRepeatStates($currentPlayMode); + SONOS_Client_Notifier('SetCurrent:Shuffle:1') if ($shuffle); + SONOS_Client_Notifier('SetCurrent:Repeat:1') if ($repeat); + SONOS_Client_Notifier('SetCurrent:RepeatOne:1') if ($repeatOne); # CrossfadeMode ermitteln SONOS_Client_Notifier('SetCurrent:CrossfadeMode:'.$1) if ($properties{LastChangeDecoded} =~ m//i); @@ -7157,7 +7242,11 @@ sub SONOS_ZoneGroupTopologyCallback($$) { } SONOS_Log undef, 4, 'Retrieved TopoType: '.$topoType; - $fieldType = substr($topoType, 1) if ($topoType ne ''); + if ($topoType ne '') { + $fieldType = substr($topoType, 1); + } else { + $fieldType = ''; + } # Für den Aliasnamen schöne Bezeichnungen ermitteln... my $aliasSuffix = ''; diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm index c24372bca..ccf062440 100755 --- a/fhem/FHEM/21_SONOSPLAYER.pm +++ b/fhem/FHEM/21_SONOSPLAYER.pm @@ -85,6 +85,7 @@ my %sets = ( 'StartPlaylist' => 'playlistname [ClearPlaylist]', 'SavePlaylist' => 'playlistname', 'DeletePlaylist' => 'playlistname', + 'DeleteFromQueue' => 'PerlNumberListOfIndizies', 'CurrentPlaylist' => '', 'EmptyPlaylist' => '', 'LoadFavourite' => 'favouritename', @@ -99,11 +100,13 @@ my %sets = ( 'Mute' => 'state', 'Shuffle' => 'state', 'Repeat' => 'state', + 'RepeatOne' => 'state', 'CrossfadeMode' => 'state', 'LEDState' => 'state', 'MuteT' => '', 'ShuffleT' => '', 'RepeatT' => '', + 'RepeatOneT' => '', 'VolumeD' => '', 'VolumeU' => '', 'Volume' => 'volumelevel(0..100) [RampType]', @@ -396,7 +399,7 @@ sub SONOSPLAYER_Set($@) { $key = $key.':slider,-100,1,100' if ($key eq 'Balance'); $key = $key.':slider,-15,1,15' if ($key eq 'SubGain'); $key = $key.':slider,-15,1,15' if ($key eq 'SurroundLevel'); - $key = $key.':slider,1,1,'.ReadingsVal($hash->{NAME}, 'numberOfTracks', 0) if ($key eq 'currentTrack'); + $key = $key.':slider,1,1,'.ReadingsVal($hash->{NAME}, 'numberOfTracks', 0) if (($key eq 'currentTrack') || ($key eq 'track')); } $key = $key.':0,1,2' if ($key eq 'SubPolarity'); @@ -418,6 +421,7 @@ sub SONOSPLAYER_Set($@) { || (lc($key) eq 'outputfixed') || (lc($key) eq 'resetattributestodefault') || (lc($key) eq 'repeat') + || (lc($key) eq 'repeatone') || (lc($key) eq 'shuffle')); # Iconauswahl einsetzen @@ -577,6 +581,16 @@ sub SONOSPLAYER_Set($@) { $udn = $hash->{UDN}; SONOS_DoWork($udn, 'setRepeat', '~~'); + } elsif (lc($key) eq 'repeatone') { + $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); + $udn = $hash->{UDN}; + + SONOS_DoWork($udn, 'setRepeatOne', $value); + } elsif (lc($key) eq 'repeatonet') { + $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); + $udn = $hash->{UDN}; + + SONOS_DoWork($udn, 'setRepeatOne', '~~'); } elsif (lc($key) eq 'crossfademode') { $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); $udn = $hash->{UDN}; @@ -680,6 +694,13 @@ sub SONOSPLAYER_Set($@) { } } elsif (lc($key) eq 'deleteplaylist') { SONOS_DoWork($udn, 'deletePlaylist', $value); + } elsif (lc($key) eq 'deletefromqueue') { + $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); + $udn = $hash->{UDN}; + + $value =~ s/ //g; + + SONOS_DoWork($udn, 'deleteFromQueue', uri_escape($value)); } elsif (lc($key) eq 'currentplaylist') { $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); $udn = $hash->{UDN}; @@ -1201,6 +1222,12 @@ sub SONOSPLAYER_Log($$$) {
  • Repeat <State>
    Sets the repeat-state. Retrieves the new state as the result.
  • +
  • +RepeatOne <State> +
    Sets the repeatOne-state. Retrieves the new state as the result.
  • +
  • +RepeatOneT +
    Toggles the repeatOne-state. Retrieves the new state as the result.
  • RepeatT
    Toggles the repeat-state. Retrieves the new state as the result.
  • @@ -1239,6 +1266,9 @@ sub SONOSPLAYER_Log($$$) {
  • CurrentPlaylist
    Sets the current playing to the current queue, but doesn't start playing (e.g. after hearing of a radiostream, where the current playlist still exists but is currently "not in use")
  • +
  • +DeleteFromQueue +
    Deletes the elements from the current queue with the given indices. You can use the ususal perl-array-formats like "1..12,17,20..22". The indices reference to the position in the current view of the list (this usually differs between the normal playmode and the shuffleplaymode).
  • DeletePlaylist
    Deletes the Sonos-Playlist with the given name. According to the possibilities of the playlistname have a close look at LoadPlaylist.
  • @@ -1367,7 +1397,7 @@ sub SONOSPLAYER_Log($$$) {
  • generateInfoSummarize4 <string>
    Generates the reading 'InfoSummarize4' with the given format. More Information on this in the examples-section.
  • stateVariable <string> -
    One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,
    Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,
    nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,
    HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,
    InfoSummarize2,InfoSummarize3,InfoSummarize4). Defines, which variable has to be copied to the content of the state-variable.
  • +
    One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,
    Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,
    nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,RepeatOne,CrossfadeMode,Balance,
    HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,
    InfoSummarize2,InfoSummarize3,InfoSummarize4). Defines, which variable has to be copied to the content of the state-variable.
  • Controloptions
    • maxVolume <int> @@ -1392,7 +1422,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
    • Format of InfoSummarize:
      infoSummarizeX := <NormalAudio>:summarizeElem:</NormalAudio> <StreamAudio>:summarizeElem:</StreamAudio>|:summarizeElem:
      :summarizeElem: := <:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"][ ifempty=":text:"]/[ emptyVal=":text:"]>
      -:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|
      Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|
      nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|
      HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|
      InfoSummarize2|InfoSummarize3|InfoSummarize4

      +:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|
      Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|
      nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|RepeatOne|CrossfadeMode|Balance|
      HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|
      InfoSummarize2|InfoSummarize3|InfoSummarize4

      :text: := [Any text without double-quotes]
    @@ -1551,6 +1581,12 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • Repeat <State>
    Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand.
  • +
  • +RepeatOne <State> +
    Legt den Zustand des RepeatOne-Zustands fest. Liefert den aktuell gültigen RepeatOne-Zustand.
  • +
  • +RepeatOneT +
    Schaltet den Zustand des RepeatOne-Zustands um. Liefert den aktuell gültigen RepeatOne-Zustand.
  • RepeatT
    Schaltet den Zustand des Repeat-Zustands um. Liefert den aktuell gültigen Repeat-Zustand.
  • @@ -1589,6 +1625,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • CurrentPlaylist
    Setzt den Abspielmodus auf die aktuelle Abspielliste, startet aber keine Wiedergabe (z.B. nach dem Hören eines Radiostreams, wo die aktuelle Abspielliste noch existiert, aber gerade "nicht verwendet" wird)
  • +
  • +DeleteFromQueue +
    Löscht die angegebenen Elemente aus der aktuellen Abspielliste. Die Angabe erfolgt über die Indizies der Titel. Es können die bei Perl-Array-üblichen Formate verwendet werden: "1..12,17,20..22". Die Indizies beziehen sich auf die aktuell angezeigte Reihenfolge (diese unterscheidet sich zwischen der normalen Abspielweise und dem Shufflemodus).
  • DeletePlaylist
    Löscht die bezeichnete Playliste. Zum möglichen Format des Playlistenamen unter LoadPlaylist nachsehen.
  • @@ -1717,7 +1756,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • generateInfoSummarize4 <string>
    Erzeugt das Reading 'InfoSummarize4' mit dem angegebenen Format. Mehr Informationen dazu im Bereich Beispiele.
  • stateVariable <string> -
    One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,
    Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,
    nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,
    HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,I
    nfoSummarize2,InfoSummarize3,InfoSummarize4). Gibt an, welche Variable in das Reading state kopiert werden soll.
  • +
    One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,
    Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,
    nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,RepeatOne,CrossfadeMode,Balance,
    HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,I
    nfoSummarize2,InfoSummarize3,InfoSummarize4). Gibt an, welche Variable in das Reading state kopiert werden soll.
  • Steueroptionen
    • maxVolume <int> @@ -1742,7 +1781,7 @@ Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Se
    • Format von InfoSummarize:
      infoSummarizeX := <NormalAudio>:summarizeElem:</NormalAudio> <StreamAudio>:summarizeElem:</StreamAudio>|:summarizeElem:
      :summarizeElem: := <:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"][ ifempty=":text:"]/[ emptyVal=":text:"]>
      -:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|
      Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|
      nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|
      HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|
      InfoSummarize2|InfoSummarize3|InfoSummarize4

      +:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|
      Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|
      nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|RepeatOne|CrossfadeMode|Balance|
      HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|
      InfoSummarize2|InfoSummarize3|InfoSummarize4

      :text: := [Jeder beliebige Text ohne doppelte Anführungszeichen]