github Nezreka/SoulSync 2.4.2
Version 2.4.2

4 hours ago

2.4.2

Headlines

  • Big sync sessions no longer wedge after 2-3 hours. slskd had no http timeout, so when it hung the worker thread blocked forever. Bounded the timeout, downloads keep flowing. (#499)
  • Plex: all libraries combined. new "all libraries (combined)" option in plex settings — works for users with multiple music libraries (e.g. plex home families). One api call, plex aggregates. (#505)
  • Discogs collection in Your Albums. set your discogs token, add it as a source, your full discogs collection shows up in discover.
  • SoundCloud as a download source. plug it into the existing source picker — works alongside soulseek / youtube / tidal / qobuz / hifi / deezer / lidarr.
  • Top tracks download on artist page. the "popular" sidebar on artist detail now pulls top tracks from your primary source (spotify / deezer) with per-row + bulk download buttons. itunes / discogs / musicbrainz still falls back to the last.fm display. (#513)

Bug Fixes

  • AcoustID stops letting instrumentals through as vocal tracks. title-similarity check was stripping "(Instrumental)" / "(Live)" / etc before comparing — vocal vs instrumental versions both normalized to the same string and passed. Now detects version on each side first, rejects mismatches. Discord report.
  • Library reorganize no longer misclassifies album tracks as singles. rewrote to delegate to the per-album planner the artist-detail modal already uses — db-driven, knows the album has n tracks regardless of how many sit in the transfer folder. (#500)
  • Enrich now honors manual album matches. clicking enrich after manually matching an album would overwrite your match with whatever the worker's fuzzy search returned. Now reads the stored id first, fetches directly. (#501)
  • HiFi instance add no longer errors with "no such table". defensive lazy-create on every CRUD method — self-heals when the bulk db init rolled back the create due to a later migration failure. (#503)
  • Download Discography no longer shows the wrong artist's albums. clicking discog on 50 cent could show young hot rod's albums. Now resolves per-source ids from the library row.
  • Enhance Quality matches Download Discography behavior. uses stored source ids (spotify / deezer / itunes / soul) for direct lookup instead of fuzzy text — same path discog already used. Falls back to text search only when no ids are stored.
  • Watchlist no longer re-downloads compilations / soundtracks. album-name fuzzy check now strips qualifier parentheticals (music from..., ost, deluxe edition, etc) before comparing. One user reported the same song downloaded 7 times — fix kills the loop.
  • Watchlist no longer re-downloads tracks already on disk. added matching by stable external id (spotify / deezer / itunes / tidal / qobuz / musicbrainz / audiodb / hydrabase / isrc) before falling through to fuzzy.
  • ReplayGain wrote +52 dB to every track. parser was reading the per-window value at t=0.5s (silent intro) instead of the integrated loudness from ffmpeg's summary block. Now reads the right value.
  • Tracks no longer show "completed" when the file was actually quarantined. integrity rejection now correctly marks the task failed. Discord report on Mr. Morale download.
  • Lossy copy now deletes original FLAC when configured. setting was being read but ignored.
  • Repair card "X findings" badge now reflects current state. showed historical "found in last scan" count even after bulk-fix moved findings to resolved. Now shows pending count when > 0, muted "X found in last scan" when zero.
  • Auto-import handles multi-disc folders + featured-artist tag drift. kendrick deluxe rip (Disc 1/Disc 2 only) and albums with varying per-track artists now classify correctly.
  • Lidarr right-track-lands fix + metadata profile lookup. matched against lidarr's tracklist instead of taking the first imported file.
  • Tidal auth error 1002 for docker / remote access. dropped the request-host fallback that overrode the documented redirect uri.
  • Reject broken slskd files before tagging. size sanity, mutagen parse, duration agreement (3s tolerance) — broken files quarantined instead of polluting the library.
  • MBID mismatch detector + persistent release cache. stops navidrome from splitting albums when tracks carry different MUSICBRAINZ_ALBUMID tags.
  • Album completeness auto-fill works on docker / shared library setups. path resolver now searches the configured library paths and plex-reported library locations, not just transfer + downloads. (#476)
  • Search picker no longer defaults to spotify on non-admin profiles. read from /status instead of the admin-only /api/settings. (#515)
  • Stop swallowing exceptions silently. ~330 silent except: pass blocks across the codebase now log to debug — failure paths are inspectable instead of disappearing. Ruff S110 enabled to catch regressions. (#369)

Changes

  • Discogs primary source gated by token — no token = revert gracefully instead of erroring.
  • Spotify worker pauses on non-spotify primary — stops burning api budget when not selected.
  • Per-track sources persisted at download time — for plex / jellyfin / navidrome users, source ids no longer wait for enrichment.
  • Auto-import live per-track progress in history — see "track 3/14" while it processes instead of waiting 5+ minutes for an empty card.
  • Sidebar library button shows artist breadcrumb when viewing an artist detail page.
  • Library disk usage stat on the stats page (uses media-server-reported file_size, no filesystem walk).
  • Beatport tab hidden — cloudflare turnstile broke the scraper. Backend kept for future revival.

Internals

  • Major web_server.py decomposition — ~30 routes / workers / helpers extracted into focused modules under core/.
  • Download engine refactor — plugin contract + central worker / state / fallback. ~700 LOC removed across client files. Adding a new source (e.g. usenet) now needs one client + one registry entry.
  • Media server engine — owns plex / jellyfin / navidrome / soulsync clients via a shared contract, generic accessors instead of per-client globals.
  • Centralized metadata source selectioncore/metadata_service.py is the single source of truth.
  • Enrichment bubble routes consolidated — every /api/<service>/<action> flows through one registry-driven endpoint instead of 30 hand-rolled routes.

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.