From fee1c67521d3d2b84bdf8ec82552a50bfad6faf5 Mon Sep 17 00:00:00 2001 From: lolodomo Date: Mon, 6 Nov 2017 11:58:07 +0100 Subject: [PATCH] Sonos: optimization for cover art download (#4500) In case of a Sonos group, the cover art is now downloaded only once. Fix #4482 Signed-off-by: Laurent Garnier --- .../internal/handler/ZonePlayerHandler.java | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/extensions/binding/org.eclipse.smarthome.binding.sonos/src/main/java/org/eclipse/smarthome/binding/sonos/internal/handler/ZonePlayerHandler.java b/extensions/binding/org.eclipse.smarthome.binding.sonos/src/main/java/org/eclipse/smarthome/binding/sonos/internal/handler/ZonePlayerHandler.java index be913ebdae1..4c222e9ccb7 100644 --- a/extensions/binding/org.eclipse.smarthome.binding.sonos/src/main/java/org/eclipse/smarthome/binding/sonos/internal/handler/ZonePlayerHandler.java +++ b/extensions/binding/org.eclipse.smarthome.binding.sonos/src/main/java/org/eclipse/smarthome/binding/sonos/internal/handler/ZonePlayerHandler.java @@ -500,7 +500,6 @@ public void onValueReceived(String variable, String value, String service) { updateChannel(CURRENTTRACKURI); break; case "CurrentAlbumArtURI": - updateChannel(CURRENTALBUMART); updateChannel(CURRENTALBUMARTURL); break; @@ -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(); @@ -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 @@ -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) { @@ -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() {