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.
pull/21983/head
Anders Melchiorsen 2019-03-12 14:39:55 +01:00 committed by Pascal Vizeli
parent 2225425ed2
commit dd11f8d3fe
1 changed files with 6 additions and 1 deletions

View File

@ -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)