mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
A speaker registers each DLNA media server as a STORED_MUSIC source whose account is "<UDN>/0", and reconciles its source list against marge (/full + /sources). AddSource deduped STORED_MUSIC by provider ID alone, so registering a second media server overwrote the first in the datastore; the first then disappeared from /full + /sources and the speaker dropped it. Only one media server could ever stay registered. - STORED_MUSIC now replaces only when the account (SourceKey.Account) matches, so distinct servers coexist and re-adding the same server updates in place. Other (singleton) providers keep replace-by-provider. - Generate source IDs from crypto/rand instead of a per-second timestamp. SaveConfiguredSources dedups by ID, so two sources created in the same instant would otherwise collide and one would be silently dropped; a timestamp (even nanosecond) is fragile on coarse clocks, so use 64 bits of randomness with a timestamp fallback only if the RNG fails. - Add a regression test for two coexisting media servers + same-account update. Diagnosed from speaker + service logs: setMusicServiceAccount succeeds locally, the speaker pushes AddSource to marge (streaming.bose.com, DNS-intercepted to AfterTouch), then re-fetches /full + /sources; that list returned only the latest STORED_MUSIC source, so the speaker pruned the previously-added one. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>