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

Sonos: optimization for cover art download #4500

Merged
merged 1 commit into from Nov 6, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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