diff --git a/fhem/contrib/98_SB_PLAYER.pm b/fhem/contrib/98_SB_PLAYER.pm
index 382372e62..dc5b6c6ee 100644
--- a/fhem/contrib/98_SB_PLAYER.pm
+++ b/fhem/contrib/98_SB_PLAYER.pm
@@ -174,7 +174,7 @@ sub SB_PLAYER_Initialize( $ ) {
$hash->{AttrList} .= "updateReadingsOnSet:true,false "; # CD 0017
$hash->{AttrList} .= "statusRequestInterval "; # CD 0037
$hash->{AttrList} .= "syncedNamesSource:LMS,FHEM "; # CD 0055
- $hash->{AttrList} .= "ftuiSupport:1,0 "; # CD 0065
+ $hash->{AttrList} .= "ftuiSupport:multiple-strict,1,0,medialist,favorites,playlists "; # CD 0065 neu # CD 0086 Auswahl hinzugefügt
$hash->{AttrList} .= $readingFnAttributes;
# CD 0036 aus 37_sonosBookmarker
@@ -348,22 +348,34 @@ sub SB_PLAYER_Attr( @ ) {
my $dodelete=0;
if( $cmd eq "set" ) {
- if ($args[1] eq "0") {
- $dodelete=1;
- } elsif ($args[1] eq "1") {
+ # CD 0086 Readings einzeln aktivierbar
+ my @options=split(',',$args[1]);
+ delete($hash->{helper}{ftuiSupport}) if(defined($hash->{helper}{ftuiSupport}));
+ $hash->{helper}{ftuiSupport}{enable}=($args[1] eq '0')?0:1;
+
+ for my $opt (@options) {
+ $hash->{helper}{ftuiSupport}{favorites}=1 if($opt=~ m/favorites/)||($opt eq '1');
+ $hash->{helper}{ftuiSupport}{playlists}=1 if($opt=~ m/playlists/)||($opt eq '1');
+ $hash->{helper}{ftuiSupport}{medialist}=1 if($opt=~ m/medialist/)||($opt eq '1');
+ }
+
+ if(defined($hash->{helper}{ftuiSupport})) {
# CD 0082 Readings setzen (kein manueller statusRequest mehr nötig)
readingsBeginUpdate( $hash );
- my $t=$hash->{FAVSTR};
- $t=~s/,/:/g;
- readingsBulkUpdate( $hash, "ftuiFavoritesItems", $t );
- $t=~s/_/ /g;
- readingsBulkUpdate( $hash, "ftuiFavoritesAlias", $t );
-
- $t=$hash->{SERVERPLAYLISTS};
- $t=~s/,/:/g;
- readingsBulkUpdate( $hash, "ftuiPlaylistsItems", $t );
- $t=~s/_/ /g;
- readingsBulkUpdate( $hash, "ftuiPlaylistsAlias", $t );
+ if(defined($hash->{helper}{ftuiSupport}{favorites})) {
+ my $t=$hash->{FAVSTR};
+ $t=~s/,/:/g;
+ readingsBulkUpdate( $hash, "ftuiFavoritesItems", $t );
+ $t=~s/_/ /g;
+ readingsBulkUpdate( $hash, "ftuiFavoritesAlias", $t );
+ }
+ if(defined($hash->{helper}{ftuiSupport}{playlists})) {
+ my $t=$hash->{SERVERPLAYLISTS};
+ $t=~s/,/:/g;
+ readingsBulkUpdate( $hash, "ftuiPlaylistsItems", $t );
+ $t=~s/_/ /g;
+ readingsBulkUpdate( $hash, "ftuiPlaylistsAlias", $t );
+ }
if( AttrVal( $name, "donotnotify", "false" ) eq "true" ) {
readingsEndUpdate( $hash, 0 );
} else {
@@ -372,23 +384,35 @@ sub SB_PLAYER_Attr( @ ) {
# CD 0082 end
delete($hash->{SONGINFOQUEUE}) if(defined($hash->{SONGINFOQUEUE})); # CD 0072
- if(defined($hash->{helper}{playlistIds})) {
- $hash->{helper}{playlistInfoRetries}=5; # CD 0076
- my @ids=split(',',$hash->{helper}{playlistIds});
- foreach(@ids) {
- IOWrite( $hash, $hash->{PLAYERMAC}." songinfo 0 100 track_id:".$_." tags:acdltuxNK\n" ) unless((defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote})) || ($_==0));
+ $hash->{helper}{songinfoquery}=''; # CD 0084
+ $hash->{helper}{songinfocounter}=0; # CD 0084
+ $hash->{helper}{songinfopending}=0; # CD 0084
+ if(defined($hash->{helper}{ftuiSupport}{medialist})) {
+ if(defined($hash->{helper}{playlistIds})) {
+ $hash->{helper}{playlistInfoRetries}=5; # CD 0076
+ my @ids=split(',',$hash->{helper}{playlistIds});
+ foreach(@ids) {
+ # CD 0084 verzögert abfragen, ansonsten Probleme bei schwacher Hardware
+ SB_PLAYER_SonginfoAddQueue($hash,$_,0) unless((defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote})) || ($_==0));
+ }
+ SB_PLAYER_SonginfoAddQueue($hash,0,0);
}
- IOWrite( $hash, $hash->{PLAYERMAC}." FHEMupdatePlaylistInfoDone\n" );
}
}
} else {
+ delete($hash->{helper}{ftuiSupport}) if(defined($hash->{helper}{ftuiSupport}));
+ $hash->{helper}{ftuiSupport}{enable}=0;
$dodelete=1;
}
# CD 0068 start
- if($dodelete==1) {
+ if(($dodelete==1)||!defined($hash->{helper}{ftuiSupport}{medialist})) {
delete($hash->{READINGS}{ftuiMedialist}) if defined($hash->{READINGS}{ftuiMedialist});
+ }
+ if(($dodelete==1)||!defined($hash->{helper}{ftuiSupport}{playlists})) {
delete($hash->{READINGS}{ftuiPlaylistsItems}) if defined($hash->{READINGS}{ftuiPlaylistsItems});
delete($hash->{READINGS}{ftuiPlaylistsAlias}) if defined($hash->{READINGS}{ftuiPlaylistsAlias});
+ }
+ if(($dodelete==1)||!defined($hash->{helper}{ftuiSupport}{favorites})) {
delete($hash->{READINGS}{ftuiFavoritesItems}) if defined($hash->{READINGS}{ftuiFavoritesItems});
delete($hash->{READINGS}{ftuiFavoritesAlias}) if defined($hash->{READINGS}{ftuiFavoritesAlias});
}
@@ -713,6 +737,10 @@ sub SB_PLAYER_Define( $$ ) {
$hash->{helper}{lmsvolume}=0; # CD 0065
}
+ $hash->{helper}{songinfoquery}=''; # CD 0084
+ $hash->{helper}{songinfocounter}=0; # CD 0084
+ $hash->{helper}{songinfopending}=0; # CD 0084
+
# do and update of the status
InternalTimer( gettimeofday() + 10,
"SB_PLAYER_GetStatus",
@@ -1124,26 +1152,28 @@ sub SB_PLAYER_Parse( $$ ) {
}
# CD 0039 end
} elsif( $args[ 0 ] eq "shuffle" ) {
- if( $args[ 1 ] eq "0" ) {
- readingsBulkUpdate( $hash, "shuffle", "off" );
- } elsif( $args[ 1 ] eq "1") {
- readingsBulkUpdate( $hash, "shuffle", "song" );
- } elsif( $args[ 1 ] eq "2") {
- readingsBulkUpdate( $hash, "shuffle", "album" );
- } else {
- readingsBulkUpdate( $hash, "shuffle", "?" );
- }
- # CD 0039 Änderung am Master, gesyncte Player aktualisieren
- if ($hash->{PLAYERMAC} eq $hash->{SYNCMASTER}) {
- if (defined($hash->{SYNCGROUP}) && ($hash->{SYNCGROUP} ne '?') && ($hash->{SYNCMASTER} ne 'none')) {
- my @pl=split(",",$hash->{SYNCGROUP});
- foreach (@pl) {
- IOWrite( $hash, "$_ playlist shuffle ?\n" );
+ if(defined($args[ 1 ])) { # CD 0086
+ if( $args[ 1 ] eq "0" ) {
+ readingsBulkUpdate( $hash, "shuffle", "off" );
+ } elsif( $args[ 1 ] eq "1") {
+ readingsBulkUpdate( $hash, "shuffle", "song" );
+ } elsif( $args[ 1 ] eq "2") {
+ readingsBulkUpdate( $hash, "shuffle", "album" );
+ } else {
+ readingsBulkUpdate( $hash, "shuffle", "?" );
+ }
+ # CD 0039 Änderung am Master, gesyncte Player aktualisieren
+ if ($hash->{PLAYERMAC} eq $hash->{SYNCMASTER}) {
+ if (defined($hash->{SYNCGROUP}) && ($hash->{SYNCGROUP} ne '?') && ($hash->{SYNCMASTER} ne 'none')) {
+ my @pl=split(",",$hash->{SYNCGROUP});
+ foreach (@pl) {
+ IOWrite( $hash, "$_ playlist shuffle ?\n" );
+ }
}
}
+ # CD 0039 end
+ SB_PLAYER_GetStatus( $hash ); # CD 0014
}
- # CD 0039 end
- SB_PLAYER_GetStatus( $hash ); # CD 0014
} elsif( $args[ 0 ] eq "name" ) {
# CD 0014 start
$queryMode=0;
@@ -1202,6 +1232,10 @@ sub SB_PLAYER_Parse( $$ ) {
} elsif( $args[ 0 ] eq "clear" ) {
readingsBulkUpdate( $hash, "currentPlaylistName", "none" );
readingsBulkUpdate( $hash, "playlists", "none" );
+ readingsBulkUpdate( $hash, "playlistTracks", 0 ); # CD 0084
+ readingsBulkUpdate( $hash, "duration", 0 ); # CD 0084
+ $hash->{helper}{playlistIds}='0'; # CD 0084
+ readingsBulkUpdate( $hash, "ftuiMedialist", '[{"Artist":"-","Title":"-","Album":"-","Time":"0","File":"-","Track":"0","Cover":"-"}]') if(defined($hash->{helper}{ftuiSupport}{medialist})); # CD 0084
# CD 0009 end
SB_PLAYER_GetStatus( $hash ); # CD 0014
} elsif( $args[ 0 ] eq "url" ) {
@@ -1311,10 +1345,18 @@ sub SB_PLAYER_Parse( $$ ) {
} elsif( $cmd eq "title" ) {
readingsBulkUpdate( $hash, "currentTitle", join( " ", @args ) );
- SB_PLAYER_ftuiMedialist( $hash ) if(AttrVal($name,"ftuiSupport","") eq "1"); # CD 0082
+ RemoveInternalTimer( "ftuiMedialist:$name"); # CD 0085
+ InternalTimer( gettimeofday() + 0.01, # CD 0085
+ "SB_PLAYER_tcb_ftuiMedialist",
+ "ftuiMedialist:$name",
+ 0 ) if(defined($hash->{helper}{ftuiSupport}{medialist})); # CD 0082
} elsif( $cmd eq "artist" ) {
readingsBulkUpdate( $hash, "currentArtist", join( " ", @args ) );
- SB_PLAYER_ftuiMedialist( $hash ) if(AttrVal($name,"ftuiSupport","") eq "1"); # CD 0082
+ RemoveInternalTimer( "ftuiMedialist:$name");
+ InternalTimer( gettimeofday() + 0.01,
+ "SB_PLAYER_tcb_ftuiMedialist",
+ "ftuiMedialist:$name",
+ 0 ) if(defined($hash->{helper}{ftuiSupport}{medialist})); # CD 0082
} elsif( $cmd eq "album" ) {
readingsBulkUpdate( $hash, "currentAlbum", join( " ", @args ) );
@@ -1761,7 +1803,8 @@ sub SB_PLAYER_Parse( $$ ) {
my $flush=0;
#Log3( $hash, 3, "SB_PLAYER_Parse: $name: parsing songinfo: $msg" ); # CD 0072
-
+ $hash->{helper}{songinfopending}--; # CD 0084
+
foreach( @args ) {
$flush=0;
if( $_ =~ /^(id:)(-?[0-9]*)/ ) {
@@ -1839,7 +1882,12 @@ sub SB_PLAYER_Parse( $$ ) {
# if (rand() > 0.4) {delete $hash->{helper}{playlistInfo}{$trackid}};
# TEST
} elsif( $cmd eq "FHEMupdatePlaylistInfoDone" ) {
- SB_PLAYER_ftuiMedialist( $hash );
+ $hash->{helper}{songinfopending}=0; # CD 0084
+ RemoveInternalTimer( "ftuiMedialist:$name"); # CD 0085
+ InternalTimer( gettimeofday() + 0.01, # CD 0085
+ "SB_PLAYER_tcb_ftuiMedialist",
+ "ftuiMedialist:$name",
+ 0 );
# CD 0065 end
} elsif( $cmd eq "NONE" ) {
# we shall never end up here, as cmd=NONE is used by the server for
@@ -1864,6 +1912,38 @@ sub SB_PLAYER_Parse( $$ ) {
return( $name );
}
+# CD 0085
+# ----------------------------------------------------------------------------
+# delay building ftuiMedialist reading
+# ----------------------------------------------------------------------------
+sub SB_PLAYER_tcb_ftuiMedialist( $ ) {
+ my($in ) = shift;
+ my(undef,$name) = split(':',$in);
+ my $hash = $defs{$name};
+
+ if(defined($hash->{helper}{ftuiSupport}{medialist})) {
+ my $t31=time;
+ readingsBeginUpdate( $hash );
+ if((time-$t31)>0.5) {
+ Log3($hash,3,"SB_PLAYER_tcb_ftuiMedialist($name), time:".int((time-$t31)*1000)."ms cmd: prepare FHEM event handling");
+ }
+ $t31=time;
+ SB_PLAYER_ftuiMedialist($hash);
+ if((time-$t31)>0.5) {
+ Log3($hash,3,"SB_PLAYER_tcb_ftuiMedialist($name), time:".int((time-$t31)*1000)."ms cmd: SB_PLAYER_ftuiMedialist");
+ }
+ $t31=time;
+ if( AttrVal( $name, "donotnotify", "false" ) eq "true" ) {
+ readingsEndUpdate( $hash, 0 );
+ } else {
+ readingsEndUpdate( $hash, 1 );
+ }
+ if((time-$t31)>0.5) {
+ Log3($hash,3,"SB_PLAYER_tcb_ftuiMedialist($name), time:".int((time-$t31)*1000)."ms cmd: execute FHEM event handling");
+ }
+ }
+}
+
# CD 0082
# ----------------------------------------------------------------------------
# build ftuiMedialist reading
@@ -1917,24 +1997,29 @@ sub SB_PLAYER_ftuiMedialist($) {
}
} else {
$ftuimedialist.="{\"Artist\":\"-\",";
+ if($hash->{helper}{playlistInfoRetries}>0) { # CD 0076
+ SB_PLAYER_SonginfoAddQueue($hash,$_,$wait) unless ($_==0); # CD 0072 # CD 0076
+ $wait=0;
+ # CD 0084 start
+ if(ReadingsVal($name,'playlistTracks',0) eq '0') {
+ $ftuimedialist.="\"Title\":\"-\",";
+ } else {
+ # CD 0084 end
+ $ftuimedialist.="\"Title\":\"loading...\",";
+ }
+ } else {
+ $ftuimedialist.="\"Title\":\"no data\","; # CD 0076
+ Log3( $hash, 3, "SB_PLAYER_Parse: $name: no songinfo for id $_" ); # CD 0072
+ }
$ftuimedialist.="\"Album\":\"-\",";
$ftuimedialist.="\"Time\":\"0\",";
$ftuimedialist.="\"File\":\"-\",";
$ftuimedialist.="\"Track\":\"0\",";
$ftuimedialist.="\"Cover\":\"-\"},";
- if($hash->{helper}{playlistInfoRetries}>0) { # CD 0076
- SB_PLAYER_SonginfoAddQueue($hash,$_,$wait) unless ($_==0); # CD 0072 # CD 0076
- $wait=0;
- $ftuimedialist.="\"Title\":\"loading...\",";
- } else {
- $ftuimedialist.="\"Title\":\"no data\","; # CD 0076
- Log3( $hash, 3, "SB_PLAYER_Parse: $name: no songinfo for id $_" ); # CD 0072
- }
}
$trackcounter+=1; # CD 0082
}
$ftuimedialist=~s/,$/]/;
- #Log 0,$ftuimedialist;
readingsBulkUpdate( $hash, "ftuiMedialist", $ftuimedialist );
}
# CD 0082 end
@@ -2221,6 +2306,11 @@ sub SB_PLAYER_Notify( $$ ) {
# CD 0077 unbenutzte Attribute entfernen
$modules{$hash->{TYPE}}{AttrList} =~ s/serverautoon.//;
$modules{$hash->{TYPE}}{AttrList} =~ s/idismac.//;
+ # CD 0084
+ InternalTimer( gettimeofday() + 1.0,
+ "SB_PLAYER_tcb_SonginfoHandleQueue",
+ "SonginfoHandleQueue:$name",
+ 0 );
}
# CD 0036 start
@@ -3052,14 +3142,20 @@ sub SB_PLAYER_Set( $@ ) {
# CD 0065 start
} elsif( $cmd eq "updateFTUImedialist" ) {
delete($hash->{SONGINFOQUEUE}) if(defined($hash->{SONGINFOQUEUE})); # CD 0072
+ $hash->{helper}{songinfoquery}=''; # CD 0084
+ $hash->{helper}{songinfocounter}=0; # CD 0084
+ $hash->{helper}{songinfopending}=0; # CD 0084
- if(defined($hash->{helper}{playlistIds})) {
- $hash->{helper}{playlistInfoRetries}=5; # CD 0076
- my @ids=split(',',$hash->{helper}{playlistIds});
- foreach(@ids) {
- IOWrite( $hash, $hash->{PLAYERMAC}." songinfo 0 100 track_id:".$_." tags:acdltuxNK\n" ) unless(defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote}) || ($_==0)); # CD 0076 id 0 ignorieren
+ if(defined($hash->{helper}{ftuiSupport}{medialist})) {
+ if(defined($hash->{helper}{playlistIds})) {
+ $hash->{helper}{playlistInfoRetries}=5; # CD 0076
+ my @ids=split(',',$hash->{helper}{playlistIds});
+ foreach(@ids) {
+ # CD 0084 verzögert abfragen, ansonsten Probleme bei schwacher Hardware
+ SB_PLAYER_SonginfoAddQueue($hash,$_,0) unless(defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote}) || ($_==0)); # CD 0076 id 0 ignorieren
+ }
+ SB_PLAYER_SonginfoAddQueue($hash,0,0);
}
- IOWrite( $hash, $hash->{PLAYERMAC}." FHEMupdatePlaylistInfoDone\n" );
}
} elsif( $cmd eq "clearFTUIcache" ) {
delete $hash->{helper}{playlistInfo} if defined($hash->{helper}{playlistInfo});
@@ -3755,29 +3851,25 @@ sub SB_PLAYER_GetStatus( $ ) {
$hash->{helper}{lastGetStatus}=gettimeofday();
# we fire the respective questions and parse the answers in parse
- IOWrite( $hash, "$hash->{PLAYERMAC} artist ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} album ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} title ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} playlist url ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} remote ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} status 0 500 tags:Kcu\n" ); # CD 0030 u added to tags
+ IOWrite( $hash, "$hash->{PLAYERMAC} artist ?\n".
+ "$hash->{PLAYERMAC} album ?\n".
+ "$hash->{PLAYERMAC} title ?\n".
+ "$hash->{PLAYERMAC} playlist url ?\n".
+ "$hash->{PLAYERMAC} remote ?\n".
+ "$hash->{PLAYERMAC} status 0 500 tags:Kcu\n". # CD 0030 u added to tags
#IOWrite( $hash, "$hash->{PLAYERMAC} alarm playlists 0 200\n" ) if (!defined($hash->{helper}{alarmPlaylists})); # CD 0016 get available elements for alarms before querying the alarms # CD 0026 wird über Server verteilt
- IOWrite( $hash, "$hash->{PLAYERMAC} alarms 0 200 tags:all filter:all\n" ); # CD 0015 filter added
- # MM 0016 start
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref alarmsEnabled ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref alarmDefaultVolume ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref alarmTimeoutSeconds ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref alarmSnoozeSeconds ?\n" );
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref alarmfadeseconds ?\n" ); # CD 0082
- # MM 0016 end
- # CD 0007
- IOWrite( $hash, "$hash->{PLAYERMAC} playerpref syncVolume ?\n" );
- # CD 0009
- IOWrite( $hash, "$hash->{PLAYERMAC} playlist name ?\n" );
- # CD 0048
- IOWrite( $hash, "$hash->{PLAYERMAC} playlist path 0 ?\n" );
- # CD 0014
- IOWrite( $hash, "$hash->{PLAYERMAC} duration ?\n" );
+ "$hash->{PLAYERMAC} alarms 0 200 tags:all filter:all\n". # CD 0015 filter added
+ # MM 0016 start
+ "$hash->{PLAYERMAC} playerpref alarmsEnabled ?\n".
+ "$hash->{PLAYERMAC} playerpref alarmDefaultVolume ?\n".
+ "$hash->{PLAYERMAC} playerpref alarmTimeoutSeconds ?\n".
+ "$hash->{PLAYERMAC} playerpref alarmSnoozeSeconds ?\n".
+ "$hash->{PLAYERMAC} playerpref alarmfadeseconds ?\n". # CD 0082
+ # MM 0016 end
+ "$hash->{PLAYERMAC} playerpref syncVolume ?\n". # CD 0007
+ "$hash->{PLAYERMAC} playlist name ?\n". # CD 0009
+ "$hash->{PLAYERMAC} playlist path 0 ?\n". # CD 0048
+ "$hash->{PLAYERMAC} duration ?\n" ); # CD 0014
SB_PLAYER_QueryElapsedTime($hash);
} # CD 0014 end
@@ -3894,7 +3986,7 @@ sub SB_PLAYER_RecBroadcast( $$@ ) {
# CD 0064
# CD 0068 start
- if(AttrVal($name,"ftuiSupport","") eq "1") {
+ if(defined($hash->{helper}{ftuiSupport}{favorites})) {
my $t=$hash->{FAVSTR};
$t=~s/,/:/g;
readingsSingleUpdate( $hash, "ftuiFavoritesItems", $t, 1 );
@@ -3938,7 +4030,7 @@ sub SB_PLAYER_RecBroadcast( $$@ ) {
} else {
$hash->{FAVSTR} = $favs;
}
- if(AttrVal($name,"ftuiSupport","") eq "1") {
+ if(defined($hash->{helper}{ftuiSupport}{favorites})) {
my $t=$hash->{FAVSTR};
$t=~s/,/:/g;
readingsSingleUpdate( $hash, "ftuiFavoritesItems", $t, 1 );
@@ -4016,7 +4108,7 @@ sub SB_PLAYER_RecBroadcast( $$@ ) {
# CD 0064
# CD 0068 start
- if(AttrVal($name,"ftuiSupport","") eq "1") {
+ if(defined($hash->{helper}{ftuiSupport}{playlists})) {
my $t=$hash->{SERVERPLAYLISTS};
$t=~s/,/:/g;
readingsSingleUpdate( $hash, "ftuiPlaylistsItems", $t, 1 );
@@ -4062,7 +4154,7 @@ sub SB_PLAYER_RecBroadcast( $$@ ) {
$hash->{SERVERPLAYLISTS}=$pls;
}
- if(AttrVal($name,"ftuiSupport","") eq "1") {
+ if(defined($hash->{helper}{ftuiSupport}{playlists})) {
my $t=$hash->{SERVERPLAYLISTS};
$t=~s/,/:/g;
readingsSingleUpdate( $hash, "ftuiPlaylistsItems", $t, 1 );
@@ -4813,16 +4905,20 @@ sub SB_PLAYER_ParsePlayerStatus( $$ ) {
$hash->{helper}{playerStatusOK}=1; # CD 0042
# CD 0065 start
- if(AttrVal($name,"ftuiSupport","") eq "1") {
+ if(defined($hash->{helper}{ftuiSupport}{medialist})) {
delete($hash->{SONGINFOQUEUE}) if(defined($hash->{SONGINFOQUEUE})); # CD 0072
+ $hash->{helper}{songinfoquery}=''; # CD 0084
+ $hash->{helper}{songinfocounter}=0; # CD 0084
+ $hash->{helper}{songinfopending}=0; # CD 0084
if(defined($hash->{helper}{playlistIds})) {
$hash->{helper}{playlistInfoRetries}=5; # CD 0076
my @ids=split(',',$hash->{helper}{playlistIds});
foreach(@ids) {
- IOWrite( $hash, $hash->{PLAYERMAC}." songinfo 0 100 track_id:".$_." tags:acdltuxNK\n" ) unless((defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote})) || ($_==0)); # CD 0071, id 0 ignorieren
+# SB_PLAYER_SonginfoAddQueue($hash,$_,0) unless ($_==0); # CD 0083
+ SB_PLAYER_SonginfoAddQueue($hash,$_,0) unless((defined($hash->{helper}{playlistInfo}{$_}) && !defined($hash->{helper}{playlistInfo}{$_}{remote})) || ($_==0)); # CD 0084
}
- IOWrite( $hash, $hash->{PLAYERMAC}." FHEMupdatePlaylistInfoDone\n" );
+ SB_PLAYER_SonginfoAddQueue($hash,0,0);
}
}
# CD 0065 end
@@ -5103,10 +5199,12 @@ SB_PLAYER_SonginfoAddQueue($$$) ################################################
$hash->{SONGINFOQUEUE} = [ $id ];
push(@{$hash->{SONGINFOQUEUE}}, $id);
RemoveInternalTimer( "SonginfoHandleQueue:$name");
- InternalTimer( gettimeofday() + ($wait==1?2.0:0.01),
- "SB_PLAYER_tcb_SonginfoHandleQueue",
- "SonginfoHandleQueue:$name",
- 0 );
+ if ($init_done>0) { # CD 0084
+ InternalTimer( gettimeofday() + ($wait==1?2.0:0.01),
+ "SB_PLAYER_tcb_SonginfoHandleQueue",
+ "SonginfoHandleQueue:$name",
+ 0 );
+ }
} else {
push(@{$hash->{SONGINFOQUEUE}}, "wait") if ($wait==1);
push(@{$hash->{SONGINFOQUEUE}}, $id);
@@ -5121,24 +5219,45 @@ SB_PLAYER_SonginfoHandleQueue($) ###############################################
my $arr = $hash->{SONGINFOQUEUE};
if(defined($arr) && @{$arr} > 0) {
- shift(@{$arr});
- if(@{$arr} == 0) {
- IOWrite( $hash, $hash->{PLAYERMAC}." FHEMupdatePlaylistInfoDone\n" );
- delete($hash->{SONGINFOQUEUE});
- return;
- }
- my $id = $arr->[0];
- if($id ne "wait") {
- if(($id eq "") || ($id==0)) { # CD 0076 id 0 ignorieren
- SB_PLAYER_SonginfoHandleQueue($hash);
- } else {
- IOWrite( $hash, $hash->{PLAYERMAC}." songinfo 0 100 track_id:".$id." tags:acdltuxNK\n" );
+ if($hash->{helper}{songinfopending}<50) {
+ shift(@{$arr});
+ if(@{$arr} == 0) {
+ if($hash->{helper}{songinfocounter}>0) {
+ IOWrite( $hash, $hash->{helper}{songinfoquery});
+ $hash->{helper}{songinfopending}+=$hash->{helper}{songinfocounter};
+ $hash->{helper}{songinfoquery}='';
+ $hash->{helper}{songinfocounter}=0;
+ }
+ IOWrite( $hash, $hash->{PLAYERMAC}." FHEMupdatePlaylistInfoDone\n" );
+ delete($hash->{SONGINFOQUEUE});
+ return;
}
+ my $id = $arr->[0];
+ if($id ne "wait") {
+ if(($id eq "") || ($id==0)) { # CD 0076 id 0 ignorieren
+ SB_PLAYER_SonginfoHandleQueue($hash);
+ } else {
+ # CD 0084 Abfragen zusammenfassen
+ $hash->{helper}{songinfoquery}=$hash->{helper}{songinfoquery}.$hash->{PLAYERMAC}." songinfo 0 100 track_id:".$id." tags:acdltuxNK\n";
+ $hash->{helper}{songinfocounter}++;
+ if($hash->{helper}{songinfocounter}>=10) {
+ IOWrite( $hash, $hash->{helper}{songinfoquery});
+ $hash->{helper}{songinfopending}+=$hash->{helper}{songinfocounter};
+ $hash->{helper}{songinfoquery}='';
+ $hash->{helper}{songinfocounter}=0;
+ }
+ }
+ }
+ InternalTimer( gettimeofday() + (($id eq "wait")?2.0:0.01),
+ "SB_PLAYER_tcb_SonginfoHandleQueue",
+ "SonginfoHandleQueue:$name",
+ 0 );
+ } else {
+ InternalTimer( gettimeofday() + 0.05,
+ "SB_PLAYER_tcb_SonginfoHandleQueue",
+ "SonginfoHandleQueue:$name",
+ 0 );
}
- InternalTimer( gettimeofday() + (($id eq "wait")?2.0:0.01),
- "SB_PLAYER_tcb_SonginfoHandleQueue",
- "SonginfoHandleQueue:$name",
- 0 );
}
}
@@ -5168,6 +5287,7 @@ sub SB_PLAYER_RemoveInternalTimers($) {
RemoveInternalTimer( "TriggerPlaylistStop:$name");
RemoveInternalTimer( "TriggerTTSDone:$name");
RemoveInternalTimer( "recallPause:$name");
+ RemoveInternalTimer( "ftuiMedialist:$name"); # CD 0085
RemoveInternalTimer( $hash );
}
# CD 0078 end
@@ -5344,8 +5464,9 @@ sub SB_PLAYER_RemoveInternalTimers($) {
Only changes in the readings currentAlbum, currentArtist, currentTitle cause an event.