mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
encoding/xml is case-sensitive, so Presets.xml files written by older AfterTouch versions using <ContentItem> (capital C) had all source, location, and type attributes silently dropped on read. Every preset for such a device had empty fields, causing mapPresetsToFullResponse to skip them all — the speaker received /full with zero presets and stored nothing. Fix: normalise <ContentItem> → <contentItem> before unmarshaling in the new readPresetsLocked helper. If normalisation was needed, GetPresets rewrites the file in canonical form after releasing the read lock, so the issue self-heals on first service start with no manual intervention. Diagnosed via the i218 encrypted diagnostic export (device 304511B46CBC, ST30 Master Bedroom): health check speaker_presets_count reported "Speaker shows 0 preset slot(s); service Presets.xml has 6", and the service log showed six [Marge] /full: skipping preset N — source "" messages per /full call. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>