This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Summary
AI summaryMulti-artist tagging overhaul populates _artists_list and applies separator/feat settings, fixing mis‑tagged tracks.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Multi-artist support overhaul with _artists_list, artist_separator, feat_in_title settings applied. Multi-artist support overhaul with _artists_list, artist_separator, feat_in_title settings applied. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Cross-script artist aliases implemented for names like Hiroyuki Sawano ↔ 澤野弘之. Cross-script artist aliases implemented for names like Hiroyuki Sawano ↔ 澤野弘之. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Retag tool now re-embeds LYRICS tag instead of clearing it. Retag tool now re-embeds LYRICS tag instead of clearing it. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Deezer cover art upgraded to 1900×1900 resolution. Deezer cover art upgraded to 1900×1900 resolution. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Scanner iterates all AcoustID candidates instead of trusting the first one, reducing false positives. Scanner iterates all AcoustID candidates instead of trusting the first one, reducing false positives. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Duration guard added to catch fingerprint hash collisions (e.g., 17‑min vs 5‑min tracks). Duration guard added to catch fingerprint hash collisions (e.g., 17‑min vs 5‑min tracks). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Configurable duration tolerance setting added (default auto 3s/5s). Configurable duration tolerance setting added (default auto 3s/5s). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
New Quarantine tab in Library History modal with per‑row Approve/Recover/Delete actions. New Quarantine tab in Library History modal with per‑row Approve/Recover/Delete actions. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Approve action re‑runs post‑process skipping only the failing check. Approve action re‑runs post‑process skipping only the failing check. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Discover track selection now applies diversity caps, source‑aware popularity thresholds, library deduplication, and SQL genre filtering. Discover track selection now applies diversity caps, source‑aware popularity thresholds, library deduplication, and SQL genre filtering. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Server playlists Find & Add persists match overrides in sync_match_cache, preventing re‑download of manually paired Spotify tracks. Server playlists Find & Add persists match overrides in sync_match_cache, preventing re‑download of manually paired Spotify tracks. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Sync append mode added to preserve user‑added tracks alongside new matches. Sync append mode added to preserve user‑added tracks alongside new matches. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Tidal favorite tracks/albums/artists appear as virtual playlists, matching Spotify Liked Songs behavior. Tidal favorite tracks/albums/artists appear as virtual playlists, matching Spotify Liked Songs behavior. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Auto‑import adds Picard/Beets parity: MBID + ISRC exact‑match fast path before fuzzy scoring, with duration sanity gate and multi‑disc deduplication. Auto‑import adds Picard/Beets parity: MBID + ISRC exact‑match fast path before fuzzy scoring, with duration sanity gate and multi‑disc deduplication. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Auto‑import falls back to secondary metadata sources when primary returns no match. Auto‑import falls back to secondary metadata sources when primary returns no match. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Server playlist sync now supports Append mode in addition to Replace. Server playlist sync now supports Append mode in addition to Replace. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Medium |
Track number tag no longer writes "6/0" when album total is unknown; drops to "6" per ID3 spec. Track number tag no longer writes "6/0" when album total is unknown; drops to "6" per ID3 spec. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Low |
Quarantine actions themed with confirm toast (no native dialogs). Quarantine actions themed with confirm toast (no native dialogs). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Feature | Low |
Artist page "Write Artist Image" button writes artist.jpg for Navidrome to read real photos. Artist page "Write Artist Image" button writes artist.jpg for Navidrome to read real photos. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Performance | Medium |
Auto‑import now processes multiple albums in parallel (3 workers default). Auto‑import now processes multiple albums in parallel (3 workers default). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Performance | Low |
Tidal album‑track fetch implemented via two‑phase cursor walk with batch hydration. Tidal album‑track fetch implemented via two‑phase cursor walk with batch hydration. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
$albumtype folder template fixed for non-Spotify sources (EPs/Singles). $albumtype folder template fixed for non-Spotify sources (EPs/Singles). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
Cross-script alias‑aware verification stops quarantining cross‑language artist tags. Cross-script alias‑aware verification stops quarantining cross‑language artist tags. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
Compilation albums no longer flag every track; per‑track artist column is read correctly. Compilation albums no longer flag every track; per‑track artist column is read correctly. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
Multi‑artist credits no longer trigger wrong‑song flags. Multi‑artist credits no longer trigger wrong‑song flags. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
MTV Unplugged and live‑album false quarantines fixed at three pipeline layers. MTV Unplugged and live‑album false quarantines fixed at three pipeline layers. Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
Undownloadable tracks are no longer shown on Discover page (id‑validity gate enforced). Undownloadable tracks are no longer shown on Discover page (id‑validity gate enforced). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
SoulSync standalone library writes receive full server‑quality rows (source IDs populated correctly). SoulSync standalone library writes receive full server‑quality rows (source IDs populated correctly). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Bugfix | Low |
Plex library scan trigger fixed for non‑English section names (e.g., Música, Musique). Plex library scan trigger fixed for non‑English section names (e.g., Música, Musique). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Refactor | Low |
Discover page sections migrated to shared createDiscoverSectionController lifecycle (~30 sections). Discover page sections migrated to shared createDiscoverSectionController lifecycle (~30 sections). Source: granite4.1:30b@2026-05-22-audit Confidence: high |
— |
| Other | Low |
affected_surface affected_surface Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Other | Low |
tagging tagging Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Other | Low |
{ { Source: llm_adapter@2026-05-21 Confidence: low |
— |
Full changelog
Release 2.5.3
dev → main. Brings in every change since 2.4.2 (2.5.0 + 2.5.1 + 2.5.2 + the version bump).
Highlights
Tagging & metadata
- Multi-artist support overhaul —
_artists_listpopulated,artist_separator+feat_in_titlesettings actually applied, Deezer/track/<id>contributor upgrade, Soulseek matched downloads pull full artist list fromtrack_info, scanner retag respectswrite_multi_artist - Cross-script artist aliases — Hiroyuki Sawano ↔ 澤野弘之, Dmitry Yablonsky ↔ Дмитрий Яблонский, etc. MusicBrainz canonical name + sort-name + non-strict search fallback all bridge correctly
- Track number tag no longer writes
"6/0"when album total is unknown — drops to"6"per ID3 spec - Retag tool now re-embeds LYRICS tag (was clearing without rewriting)
$albumtypefolder template fix for non-Spotify sources (EPs / Singles route correctly for Deezer / Tidal / etc)- Deezer cover art upgraded to 1900×1900 (was 1000×1000)
AcoustID & verification
- Multi-candidate scan — scanner now iterates ALL AcoustID candidates instead of trusting
recordings[0]. Drops false positives when AcoustID returns multiple recordings per fingerprint - Duration guard catches fingerprint hash collisions (the 17-min mashup → 5-min track case)
- Cross-script alias-aware verification stops quarantining cross-language artist tags
- Compilation albums no longer flag every track (per-track artist column finally read)
- Multi-artist credits no longer flagged as wrong song
- Configurable duration tolerance setting (default 0 = auto 3s/5s, set higher for live/concert albums)
- MTV Unplugged & live-album false-quarantine pipeline fixed at three layers (album-context title normalization, Tidal qualifier filter on primary search, qualifier inspection of
track.album.name)
Quarantine management
- New Quarantine tab in the Library History modal
- Per-row Approve / Recover / Delete actions
- Approve re-runs post-process with only the failing check skipped
- Themed confirm + toast (no native browser dialogs)
Discover page
- Section controller refactor — every discover section migrated to a shared
createDiscoverSectionControllerlifecycle (~30 sections, no more drift) - Sharper track selection — diversity caps, source-aware popularity thresholds, library dedup, SQL-pushed genre filter
- Stop showing undownloadable tracks (mandatory id-validity gate on every selection)
Server playlists
- Find & Add now persists as a permanent match override in
sync_match_cache— no more re-downloading the same Spotify track that the user already manually paired - Sync append-mode added (preserves user-added tracks)
Tidal
- Favorite tracks / albums / artists now show up as virtual playlists (parity with Spotify Liked Songs)
- Tidal album-tracks fetch via two-phase cursor walk + batch hydration
Auto-import
- Multi-album parallel processing (3 workers default)
- Picard / Beets parity — MBID + ISRC exact-match fast path before fuzzy scoring, duration sanity gate, multi-disc dedup correctness
- SoulSync standalone library writes get full server-quality rows (source IDs populated correctly)
- Falls through to fallback metadata sources when primary returns no match
Plex / Jellyfin / Navidrome
- Plex library scan trigger fixed for non-English section names (Música / Musique / Musik / etc)
- Server playlist sync now supports Append mode in addition to Replace
- Artist page "Write Artist Image" button writes
artist.jpgso Navidrome reads real artist photos
Library
- Library reorganize stops leaving orphan audio files behind
- Library history audit trail modal — full per-download lifecycle view + embedded tags grid via live mutagen read
- Discography 50-cap fix (bumped to 200 for non-Spotify sources)
- Discography skips tracks already owned (no double-queue)
- No more cross-artist tracks or unwanted remixes from discography downloads
Search & downloads
- Source picker default no longer always sticks to Spotify
- Manual search in failed-track candidates modal
- Manual picks don't auto-retry anymore
- Download Missing modal tracklist polish
- Soulseek min-delay-between-searches knob (fixes ISP anti-abuse trips)
- Auto-import album duration is album total + re-imports fill metadata gaps
Docker
- Container restart-loop fix on bind-mounted staging folder
- Writability audit at entrypoint logs missing permissions instead of silently failing
Misc
- AudioDB track worker no longer stuck in infinite retry loop (#553)
- Cross-script artist names no longer quarantine files (#442)
- Search for match no longer surfaces karaoke / tribute / "originally performed by" junk
- Deezer ISP/peer integration tweaks
- Multi-artist tag settings (
artist_separator,feat_in_title,write_multi_artist) now actually function
Closed issues (since 2.4.2)
#442, #502, #524, #534, #535, #553, #558, #559, #566, #567, #572, #584, #585, #586, #587, #588, #589, plus several Discord / Reddit reports.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Beta — feedback welcome: [email protected]