2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

SONOS: Added RepeatOne and DeleteFromQueue, fixed a bug according to the fieldType-Reading

git-svn-id: https://svn.fhem.de/fhem/trunk@10179 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rleins 2015-12-15 12:16:04 +00:00
parent ec40aced3f
commit a84b15ee04
2 changed files with 161 additions and 33 deletions

View File

@ -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/<CurrentPlayMode.*?val="(.*?)".*?\/>/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/<CurrentCrossfadeMode.*?val="(\d+)".*?\/>/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 = '';

View File

@ -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($$$) {
<li><a name="SONOSPLAYER_setter_Repeat">
<b><code>Repeat &lt;State&gt;</code></b></a>
<br /> Sets the repeat-state. Retrieves the new state as the result.</li>
<li><a name="SONOSPLAYER_setter_RepeatOne">
<b><code>RepeatOne &lt;State&gt;</code></b></a>
<br /> Sets the repeatOne-state. Retrieves the new state as the result.</li>
<li><a name="SONOSPLAYER_setter_RepeatOneT">
<b><code>RepeatOneT</code></b></a>
<br /> Toggles the repeatOne-state. Retrieves the new state as the result.</li>
<li><a name="SONOSPLAYER_setter_RepeatT">
<b><code>RepeatT</code></b></a>
<br /> Toggles the repeat-state. Retrieves the new state as the result.</li>
@ -1239,6 +1266,9 @@ sub SONOSPLAYER_Log($$$) {
<li><a name="SONOSPLAYER_setter_CurrentPlaylist">
<b><code>CurrentPlaylist</code></b></a>
<br /> 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")</li>
<li><a name="SONOSPLAYER_setter_DeleteFromQueue">
<b><code>DeleteFromQueue <index_of_elems></code></b></a>
<br /> 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).</li>
<li><a name="SONOSPLAYER_setter_DeletePlaylist">
<b><code>DeletePlaylist</code></b></a>
<br /> Deletes the Sonos-Playlist with the given name. According to the possibilities of the playlistname have a close look at LoadPlaylist.</li>
@ -1367,7 +1397,7 @@ sub SONOSPLAYER_Log($$$) {
<li><a name="SONOSPLAYER_attribut_generateInfoSummarize4"><b><code>generateInfoSummarize4 &lt;string&gt;</code></b>
</a><br /> Generates the reading 'InfoSummarize4' with the given format. More Information on this in the examples-section.</li>
<li><a name="SONOSPLAYER_attribut_stateVariable"><b><code>stateVariable &lt;string&gt;</code></b>
</a><br /> One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,<br />Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,<br />nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,<br />HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,<br />InfoSummarize2,InfoSummarize3,InfoSummarize4). Defines, which variable has to be copied to the content of the state-variable.</li>
</a><br /> One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,<br />Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,<br />nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,RepeatOne,CrossfadeMode,Balance,<br />HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,<br />InfoSummarize2,InfoSummarize3,InfoSummarize4). Defines, which variable has to be copied to the content of the state-variable.</li>
</ul></li>
<li><b>Controloptions</b><ul>
<li><a name="SONOSPLAYER_attribut_maxVolume"><b><code>maxVolume &lt;int&gt;</code></b>
@ -1392,7 +1422,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
<li><a name="SONOSPLAYER_examples_InfoSummarize">Format of InfoSummarize:</a><br />
<code>infoSummarizeX := &lt;NormalAudio&gt;:summarizeElem:&lt;/NormalAudio&gt; &lt;StreamAudio&gt;:summarizeElem:&lt;/StreamAudio&gt;|:summarizeElem:</code><br />
<code>:summarizeElem: := &lt;:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"][ ifempty=":text:"]/[ emptyVal=":text:"]&gt;</code><br />
<code>:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|<br />Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|<br />nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|<br />HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|<br />InfoSummarize2|InfoSummarize3|InfoSummarize4</code><br />
<code>:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|<br />Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|<br />nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|RepeatOne|CrossfadeMode|Balance|<br />HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|<br />InfoSummarize2|InfoSummarize3|InfoSummarize4</code><br />
<code>:text: := [Any text without double-quotes]</code><br /></li>
</ul>
@ -1551,6 +1581,12 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
<li><a name="SONOSPLAYER_setter_Repeat">
<b><code>Repeat &lt;State&gt;</code></b></a>
<br /> Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand.</li>
<li><a name="SONOSPLAYER_setter_RepeatOne">
<b><code>RepeatOne &lt;State&gt;</code></b></a>
<br /> Legt den Zustand des RepeatOne-Zustands fest. Liefert den aktuell gültigen RepeatOne-Zustand.</li>
<li><a name="SONOSPLAYER_setter_RepeatOneT">
<b><code>RepeatOneT</code></b></a>
<br /> Schaltet den Zustand des RepeatOne-Zustands um. Liefert den aktuell gültigen RepeatOne-Zustand.</li>
<li><a name="SONOSPLAYER_setter_RepeatT">
<b><code>RepeatT</code></b></a>
<br /> Schaltet den Zustand des Repeat-Zustands um. Liefert den aktuell gültigen Repeat-Zustand.</li>
@ -1589,6 +1625,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
<li><a name="SONOSPLAYER_setter_CurrentPlaylist">
<b><code>CurrentPlaylist</code></b></a>
<br /> 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)</li>
<li><a name="SONOSPLAYER_setter_DeleteFromQueue">
<b><code>DeleteFromQueue <index_of_elems></code></b></a>
<br /> 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).</li>
<li><a name="SONOSPLAYER_setter_DeletePlaylist">
<b><code>DeletePlaylist</code></b></a>
<br /> Löscht die bezeichnete Playliste. Zum möglichen Format des Playlistenamen unter LoadPlaylist nachsehen.</li>
@ -1717,7 +1756,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
<li><a name="SONOSPLAYER_attribut_generateInfoSummarize4"><b><code>generateInfoSummarize4 &lt;string&gt;</code></b>
</a><br /> Erzeugt das Reading 'InfoSummarize4' mit dem angegebenen Format. Mehr Informationen dazu im Bereich Beispiele.</li>
<li><a name="SONOSPLAYER_attribut_stateVariable"><b><code>stateVariable &lt;string&gt;</code></b>
</a><br /> One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,<br />Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,<br />nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,<br />HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,I<br />nfoSummarize2,InfoSummarize3,InfoSummarize4). Gibt an, welche Variable in das Reading <code>state</code> kopiert werden soll.</li>
</a><br /> One of (TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,<br />Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,<br />nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,RepeatOne,CrossfadeMode,Balance,<br />HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,I<br />nfoSummarize2,InfoSummarize3,InfoSummarize4). Gibt an, welche Variable in das Reading <code>state</code> kopiert werden soll.</li>
</ul></li>
<li><b>Steueroptionen</b><ul>
<li><a name="SONOSPLAYER_attribut_maxVolume"><b><code>maxVolume &lt;int&gt;</code></b>
@ -1742,7 +1781,7 @@ Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Se
<li><a name="SONOSPLAYER_examples_InfoSummarize">Format von InfoSummarize:</a><br />
<code>infoSummarizeX := &lt;NormalAudio&gt;:summarizeElem:&lt;/NormalAudio&gt; &lt;StreamAudio&gt;:summarizeElem:&lt;/StreamAudio&gt;|:summarizeElem:</code><br />
<code>:summarizeElem: := &lt;:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"][ ifempty=":text:"]/[ emptyVal=":text:"]&gt;</code><br />
<code>:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|<br />Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|<br />nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|<br />HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|<br />InfoSummarize2|InfoSummarize3|InfoSummarize4</code><br />
<code>:variable: := TransportState|NumberOfTracks|Track|TrackURI|TrackDuration|Title|Artist|Album|OriginalTrackNumber|AlbumArtist|<br />Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|<br />nextTitle|nextArtist|nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|RepeatOne|CrossfadeMode|Balance|<br />HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|<br />InfoSummarize2|InfoSummarize3|InfoSummarize4</code><br />
<code>:text: := [Jeder beliebige Text ohne doppelte Anführungszeichen]</code><br /></li>
</ul>