From dd11f8d3fe05d9a24d0f4dcfe9810e336e0f7e4c Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 12 Mar 2019 14:39:55 +0100 Subject: [PATCH] Avoid playing queue pollution when restoring Sonos snapshots (#21963) Assume a snapshot state with three speakers in two groups, AB and C. They will be playing the A and C queues, respectively. The B queue exists but is hidden in this topology. Unjoin B and form a new group BC, playing the B queue (now with the C queue hidden). To restore the snapshot we would join B back to A. The BC group would now only contain the C speaker, still playing the B queue. The C queue has been lost :-( The problem is that unjoining a coordinator will elect a new coordinator that inherits the group queue and thus has its hidden queue overwritten. This commit avoids the situation by having restore unjoin all slaves. Above, C would be unjoined before joining B to A. This restores the C queue and since B is then alone, it can be joined to A without having to transfer its playing queue to remaining speakers. --- homeassistant/components/sonos/media_player.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index e0f881f723d..fbac67b0927 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -1037,8 +1037,13 @@ class SonosEntity(MediaPlayerDevice): if entity.state == STATE_PLAYING: entity.media_pause() - # Bring back the original group topology if with_group: + # Unjoin slaves that are not already in their target group + for entity in [e for e in entities if not e.is_coordinator]: + if entity._snapshot_group != entity._sonos_group: + entity.unjoin() + + # Bring back the original group topology for entity in (e for e in entities if e._snapshot_group): if entity._snapshot_group[0] == entity: entity.join(entity._snapshot_group)