mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
marge.syncPresets / syncRecents were writing the upstream cloud's <source type="Audio"> attribute into ServicePreset.Source / ServiceRecent.Source on disk. That's a protocol-level classification, not the symbolic name the speaker itself uses (TUNEIN, INTERNET_RADIO, …). The on-disk shape ended up disagreeing with what the speaker writes via its own /presets endpoint, which IS the source of truth — and the disagreement surfaced as cross-side mismatches in the new consistency check (one user saw 30+ recent_mismatch findings, all "speaker source=X vs service source=Audio"). Project the upstream FullResponseSource back to the speaker's perspective at persist time via SourceProviderID lookup against StaticProviders (the inverse of canonicalProviderIDByID). Falls back to the upstream Type for unknown providerids so non-canonical sources stay no-worse-than-before. The consistency-check workaround in loadServiceView (which resolves Source via SourceID lookup on read) stays in place to cover legacy on-disk data written by the previous behaviour — that data only gets cleaned up when the operator re-runs setup.syncPresets from the speaker directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>