SoulSync v2.4.0
First release on proper 3-part semver. Two big projects: Search & Artists unification, and the Library Reorganize FIFO queue. Plus bug fixes from production reports and PR reviews.
Highlights
- Unified search with per-source icon picker. Search page and global popover both have one icon per source (Spotify, Apple Music, Deezer, Discogs, Hydrabase, MusicBrainz, Music Videos, Soulseek). Typing only searches the active source; results are cached per query. Roughly 6–7× fewer API calls per search vs. the old fan-out default.
- Reorganize FIFO queue with live status panel. Buttons stay clickable; spam-clicks dedupe. A backend worker drains items one at a time. Status panel shows active progress, queued count, and recent finishes; expands to a per-item list with cancel buttons. "Reorganize All" is now one backend call instead of N JS-driven calls.
- Reorganize routed through the download pipeline (winecountrygames). 3-disc albums no longer collapse to single-disc; tracks no longer silently disappear. Same template, tagging, multi-disc subfolder logic, and AcoustID verification as fresh downloads.
- Album Completeness job actually finds incomplete albums (sassmastawillis). New
api_track_countcolumn populated by metadata workers gives the job a real expected total to compare against. - Tidal: no more silent quality downgrades (Netti93). With "HiRes only, no fallback", tracks were downloading as m4a 320kbps. Now compares returned
audio_qualityagainst requested tier and rejects downgrades. - MusicBrainz search rewritten. Artist search re-enabled, track/album search uses artist-first browse instead of literal title match, cover art uses deterministic URLs instead of HEAD probes. ~3 sec on cold cache vs. 30+ before.
Bug Fixes
- Spotify post-ban cooldown bumped 5 min → 30 min. First call after cooldown was getting re-banned within 32 seconds.
- Discover hero "View Discography" 404 — click handler stopped passing
sourceto/api/artist-detail. - Clean Search History automation crashing with
'DownloadOrchestrator' object has no attribute 'base_url'. - Reorganize-preview Apply button getting stuck disabled on errors / early returns.
- Soulseek handoff from global search going through metadata flow instead of basic file search.
- Stale search requests flashing empty results on fast retype.
- Reorganize queue concurrency fixes: atomic worker pick + status flip;
Lock + Eventreplaced withthreading.Condition;enqueue_manydeduplicates within a batch. - DB helpers swallowing query errors as "album not found" — now lets exceptions bubble.
UX
- Rate-limit fallback banner when the backend swaps your selected source for a working one.
- Soulseek icon dimmed when slskd isn't configured; clicking it routes to Settings → Downloads.
- Search results restore on navigate-back from
/search. - "Show / Hide Results" toggle removed; visibility is a function of query state.
- Artist detail back button uses browser history instead of dumping you on an empty Artists page.
- Embedded Download Manager removed from Search page (~330 lines of dead code).
- Artists sidebar entry retired (duplicated unified Search). Old
/artistsURL still resolves. - Search page renamed to
/search. Old/downloadsURL still resolves; profile ACLs migrate.
Internals
- Shared
createSearchControllerfactory inshared-helpers.js— Search page and global widget consume the same state machine. ~380 lines of near-duplicate code consolidated. /api/enhanced-searchaccepts an explicitsourceparam to skip backend fan-out; cache keys isolate per-source.- Reorganize logic extracted to
core/library_reorganize.py(~195 lines out ofweb_server.py, +13 unit tests). - Semver:
_SOULSYNC_BASE_VERSIONis2.4.0. ReplacedparseFloat()version comparison with a component-by-component comparator so future patch bumps are distinguishable.
Upgrade Notes
- Reorganize modal no longer accepts a per-call template override. Reorganize uses your configured download template instead.
- Album Completeness first scan after upgrade may be slow on un-enriched albums (live API fallback). Subsequent scans are fast.
- Old
/downloadsand/artistsURLs still resolve. No DB migration needed —api_track_countis added via the existing schema-migration path on first launch.
Full changelog: v2.3...v2.4.0