mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
Root cause of #334's INVALID_SOURCE: a speaker reports device-local slots (STORED_MUSIC_MEDIA_RENDERER, UPNP) in /sources; AfterTouch imports them verbatim and re-serves them in /full. PrepareConfiguredSource fills sourceproviderid only for types in constants.StaticProviders, so these go out with an empty <sourceproviderid> — a required protobuf field — and the speaker rejects them as INVALID_SOURCE, which then re-syncs back into the datastore. Fix, keyed on the principle (no hardcoded denylist in production): - HasResolvableProviderID(s): true if the source already carries a provider id, or its source-key type resolves via StaticProviders. - Serve-side guard in getAccountSources: drop any source whose resolved sourceproviderid is still empty (generalises the existing AUX/#195 skip). Heals already-polluted datastores on the next /full, no resync needed. - Import-side filter in syncConfiguredSources (marge) and both branches of syncSources (setup): drop unresolvable sources before persisting, stopping future pollution and the re-import loop. Tests: reproduction converted to regression test (TestI334FullOmitsSourcesWithoutProviderID) seeded from a sanitised real #334 /sources capture; explicit servable/non-servable tables in TestHasResolvableProviderID. Two pre-existing fixtures that relied on sources with no provider id were given valid ones. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>