Skip to content
This repository has been archived by the owner on May 7, 2020. It is now read-only.

Commit

Permalink
Sonos: optimization for cover art download (#4500)
Browse files Browse the repository at this point in the history
In case of a Sonos group, the cover art is now downloaded only once.

Fix #4482

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
  • Loading branch information
lolodomo authored and kaikreuzer committed Nov 6, 2017
1 parent 65bf076 commit fee1c67
Showing 1 changed file with 42 additions and 13 deletions.
Expand Up @@ -500,7 +500,6 @@ public void onValueReceived(String variable, String value, String service) {
updateChannel(CURRENTTRACKURI);
break;
case "CurrentAlbumArtURI":
updateChannel(CURRENTALBUMART);
updateChannel(CURRENTALBUMARTURL);
break;

Expand Down Expand Up @@ -683,18 +682,8 @@ protected void updateChannel(String channeldD) {
}
break;
case CURRENTALBUMART:
url = getAlbumArtUrl();
if (url != null) {
// We run the update of the covert art channel in a different thread
// because it can take time
newState = null;
scheduler.submit(() -> {
RawType image = HttpUtil.downloadImage(url, true, 500000);
if (image != null) {
updateState(channeldD, image);
}
});
}
newState = null;
updateAlbumArtChannel(false);
break;
case CURRENTALBUMARTURL:
url = getAlbumArtUrl();
Expand Down Expand Up @@ -726,6 +715,38 @@ protected void updateChannel(String channeldD) {
}
}

private void updateAlbumArtChannel(boolean allGroup) {
String url = getAlbumArtUrl();
if (url != null) {
// We download the cover art in a different thread to not delay the other operations
scheduler.submit(() -> {
RawType image = HttpUtil.downloadImage(url, true, 500000);
updateChannel(CURRENTALBUMART, image != null ? image : UnDefType.UNDEF, allGroup);
});
} else {
updateChannel(CURRENTALBUMART, UnDefType.UNDEF, allGroup);
}
}

private void updateChannel(String channeldD, State state, boolean allGroup) {
if (allGroup) {
for (String member : getZoneGroupMembers()) {
try {
ZonePlayerHandler memberHandler = getHandlerByName(member);
if (memberHandler != null && memberHandler.getThing() != null
&& ThingStatus.ONLINE.equals(memberHandler.getThing().getStatus())
&& memberHandler.isLinked(channeldD)) {
memberHandler.updateState(channeldD, state);
}
} catch (IllegalStateException e) {
logger.warn("Cannot update channel for group member ({})", e.getMessage());
}
}
} else if (ThingStatus.ONLINE.equals(getThing().getStatus()) && isLinked(channeldD)) {
updateState(channeldD, state);
}
}

/**
* CurrentURI will not change, but will trigger change of CurrentURIFormated
* CurrentTrackMetaData will not change, but will trigger change of Title, Artist, Album
Expand Down Expand Up @@ -1062,11 +1083,16 @@ else if (isPlayingRadio(currentURI)
String albumArtURI = (currentTrack != null && currentTrack.getAlbumArtUri() != null
&& !currentTrack.getAlbumArtUri().isEmpty()) ? currentTrack.getAlbumArtUri() : "";

ZonePlayerHandler handlerForImageUpdate = null;
for (String member : getZoneGroupMembers()) {
try {
ZonePlayerHandler memberHandler = getHandlerByName(member);
if (memberHandler != null && memberHandler.getThing() != null
&& ThingStatus.ONLINE.equals(memberHandler.getThing().getStatus())) {
if (memberHandler.isLinked(CURRENTALBUMART)
&& hasValueChanged(albumArtURI, memberHandler.stateMap.get("CurrentAlbumArtURI"))) {
handlerForImageUpdate = memberHandler;
}
memberHandler.onValueReceived("CurrentTuneInStationId", (stationID != null) ? stationID : "",
"AVTransport");
if (needsUpdating) {
Expand All @@ -1082,6 +1108,9 @@ else if (isPlayingRadio(currentURI)
logger.warn("Cannot update media data for group member ({})", e.getMessage());
}
}
if (needsUpdating && handlerForImageUpdate != null) {
handlerForImageUpdate.updateAlbumArtChannel(true);
}
}

public boolean isGroupCoordinator() {
Expand Down

0 comments on commit fee1c67

Please sign in to comment.