github Nezreka/SoulSync 2.4.0
Version 2.4.0

12 hours ago

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_count column 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_quality against 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 source to /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 + Event replaced with threading.Condition; enqueue_many deduplicates 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 /artists URL still resolves.
  • Search page renamed to /search. Old /downloads URL still resolves; profile ACLs migrate.

Internals

  • Shared createSearchController factory in shared-helpers.js — Search page and global widget consume the same state machine. ~380 lines of near-duplicate code consolidated.
  • /api/enhanced-search accepts an explicit source param to skip backend fan-out; cache keys isolate per-source.
  • Reorganize logic extracted to core/library_reorganize.py (~195 lines out of web_server.py, +13 unit tests).
  • Semver: _SOULSYNC_BASE_VERSION is 2.4.0. Replaced parseFloat() 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 /downloads and /artists URLs still resolve. No DB migration needed — api_track_count is added via the existing schema-migration path on first launch.

Full changelog: v2.3...v2.4.0

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.