github Nezreka/SoulSync 2.5.7
Version 2.5.7

10 hours ago

Summary

Release PR: bumps _SOULSYNC_BASE_VERSION from 2.5.62.5.7 and merges the post-2.5.6 fix cycle into main. Nine user-facing fixes + one diagnostic-only logging commit.

Docker publish workflow's workflow_dispatch default tag also bumped to 2.5.7, so the manual release run pushes the correct image.

What's in 2.5.7

All bug fixes — no breaking changes, schema migrations, or new dependencies. Pure patch bump per the semver policy.

MusicBrainz fixes

  • Manual search recall — Fix popup + manual library service search were using strict Lucene phrase-match queries (recording:"X" AND artist:"Y"), killing recall on diacritics ("Bjork" vs "Björk"), bracketed suffixes like "(Live)", and any AND-clause mismatch. Switched user-facing manual lookups to bare queries that hit MB's alias/sortname indexes with diacritic folding. Enrichment workers stay strict for precision. (43ed30b4)

  • Album-detail 404 (#647 follow-up) — Every click on an MB album was silently 404-ing. The /release fetch passed cover-art-archive as an inc param, which MB rejects with 400 (that field comes back on every release response by default — no include needed). Dropped the bad include. (43ed30b4)

  • Other release-groups now visible in discography (#650) — MB tags music videos, one-off web releases, and broadcast singles with primary-type=Other. The release-group browse filter only requested album|ep|single, dropping every Other-typed group at the API layer. Centralised the type-mapper into one shared helper (core/metadata/release_type.py); added 'other' to the API filter; routed 'Other' + 'Broadcast' into the Singles section. For inabakumori, this surfaces 5 previously-invisible releases. (98740950, PR #657)

Fix popup additions

  • Paste a MusicBrainz URL or MBID to match directly (#647) — New escape hatch on the Fix Track Match modal. When fuzzy auto-search keeps ranking the wrong recording among many same-title versions, paste the recording URL or bare UUID and skip the fuzzy logic entirely. Resolves straight to that record, runs it through the existing confirm + match pipeline. (036faff8)

  • MusicBrainz added to the auto-search cascade (#655) — Modal used to query only Spotify → Deezer → iTunes. MusicBrainz was absent even for users with MB set as primary. Now it's in the cascade — first when MB is primary, last fallback otherwise. Catches niche / non-mainstream / diacritic-canonical recordings the commercial sources miss. Discogs intentionally absent (no track-level search API). (daf9a527)

Subsystem reliability

  • Quarantined files no longer re-downloaded on auto-wishlist cycles (#652) — When a file failed AcoustID and got quarantined, the candidate picker's deterministic quality ranking kept selecting the same (uploader, filename) source, re-downloading and re-quarantining the same file every cycle. Users woke up to hundreds of duplicate .quarantined entries. Soulseek candidate filter now reads quarantine sidecars and drops matching (username, filename) candidates before the quality picker ranks them. Approving/deleting the entry frees the source. (79ad4d88, PR #658)

  • slskd-unreachable log spam during non-Soulseek downloads (#649) — When slskd was configured but not running, /api/downloads/status polling fanned out to every plugin including Soulseek, producing one ERROR - Cannot connect to host ... [Name or service not known] per poll for the entire duration of any download. Connection failures now emit one WARNING with actionable context, then demote subsequent failures to debug. Flag resets on the next successful slskd response. (54e4ba84)

  • Unknown Artist Fixer crashed on every run (#646) — Repair job crashed instantly with ImportError: cannot import name '_build_path_from_template'. Commit ca5c931 had moved the path-builder helpers out of core.repair_jobs.library_reorganize into the import pipeline, but the Unknown Artist Fixer's deferred-import path was left pointing at the old module. Re-wired imports, added regression tests so the next refactor catches this class of failure in CI. (735dd738, PR #659)

Docker / infra

  • Pre-bake /app/Stream for rootless Docker (#648) — Streaming "Play" flow on basic search tried to create /app/Stream lazily at runtime, which fails silently under rootless Docker / Podman (in-container root can't write to /app). Pre-baked at image build time, matching the /app/Staging pattern. Non-persistent — no volume needed. (a33faaeb, PR #656)

Diagnostic-only (no WHATS_NEW entry)

  • Log every cancel_download caller with a trigger label — Diagnostic groundwork for #648's "Tidal sync downloads failing" report. ~91s gap between Tidal download start and cancel matches the monitor's 90s queue-timeout exactly, but none of the WARNING log lines fire so the trigger path is ambiguous. Added one [CancelTrigger:<label>] INFO log line before every cancel_download(...) call (11 sites total, 5 monitor paths + 3 web_server + 2 API + 1 candidates). Backward-compat shape on the monitor's deferred_ops tuple. Zero behavior change. (a685f9ca)

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.