- Clamp alreadyOwned to Math.max(0, ...) in batch completion display
to avoid showing negative owned count
- Map active_source deezer to deezer_track_id in both seasonal
playlist endpoints (current-playlist and curated), consistent
with core/seasonal_discovery.py logic
Adds a full Discover Sync tab to the Sync page with:
- Core UI scaffolding, playlist modal, empty-state handling
- ListenBrainz playlist integration with auto-update toggle persistence
- Sync progress tracking with matched/total counts on cards
- Navidrome playlist push on batch completion (V1 and V2 paths)
- Active download state display with polling resume on page reload
- Stuck-download detection for downloading and catch-all states
- Serialized sync queue to prevent concurrent backend contention
- Source badges, compact card layout, URL fixes