soulsync/core/sync
BoulderBadgeDad d0966ec262 Sync wishlist re-add: build the IDENTICAL payload the auto-add uses
Root cause (the real one): the auto-add passes original_tracks_map[id] — tracks_json
run through a specific normalization (album->dict with images/album_type/total_tracks/
release_date, artists->dicts). My re-add hand-rolled a different shape, so the stored
spotify_data didn't match and the wishlist's nebula (which reads spotify_data.album.
images[0].url) had no cover, plus album/single classification could differ.

Fix: extract that normalization into one shared build_original_tracks_map() and use it
in BOTH the live sync (core.discovery.sync) and the re-add. The re-add now resolves the
track by source_track_id through the same map — byte-identical payload. Verified on a
real sync row: re-add payload == live-sync payload, album.images present. (The shared
normalizer is also copy-safe, fixing a latent tracks_json mutation in the old inline
version.)

Fallback (track absent from tracks_json) rebuilds through the same normalizer with the
cover seeded from the row's image_url. 10 tests incl. a direct parity assertion.
2026-06-24 16:41:40 -07:00
..
__init__.py Persist Find & Add selections as permanent server-playlist match overrides 2026-05-14 09:39:24 -07:00
match_overrides.py Fix #787: Find & Add now records a durable manual match that survives a rescan 2026-06-04 13:46:24 -07:00
playlist_edit.py Align playlists: reorder a server playlist to the source order (Navidrome) 2026-06-24 12:58:01 -07:00
playlist_reconcile.py Server playlist editor: surface 'accurate but out of order' + read-only server-order view 2026-06-24 12:15:47 -07:00
wishlist_readd.py Sync wishlist re-add: build the IDENTICAL payload the auto-add uses 2026-06-24 16:41:40 -07:00