From 75f9c57eca0bc00fec1211d0db84c5390080d473 Mon Sep 17 00:00:00 2001 From: mrleo1nid <43583385+mrleo1nid@users.noreply.github.com> Date: Wed, 28 Oct 2026 14:29:50 +0300 Subject: [PATCH] fix(library): split compound album artist and re-split artists on rescan Co-Authored-By: Claude Sonnet 5.5 --- services/api/internal/library/scanner.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/api/internal/library/scanner.go b/services/api/internal/library/scanner.go index 5e23cc7..9aa6942 100644 --- a/services/api/internal/library/scanner.go +++ b/services/api/internal/library/scanner.go @@ -422,7 +422,13 @@ func (sc *Scanner) apply(ctx context.Context, src Source, patterns []meta.Patter if m.Album == "" { m.Album = UnknownAlbum } - albumArtist, err := sc.store.EnsureArtist(ctx, m.AlbumArtist) + known := func(k string) bool { return sc.store.ArtistKeyExists(ctx, k) } + // Альбом принадлежит одному исполнителю: у составного «A, B» это первый основной. + albumArtistName := m.AlbumArtist + if credits := meta.SplitArtists(m.AlbumArtist, known); len(credits) > 0 { + albumArtistName = credits[0].Name + } + albumArtist, err := sc.store.EnsureArtist(ctx, albumArtistName) if err != nil { return false, err } @@ -437,7 +443,9 @@ func (sc *Scanner) apply(ctx context.Context, src Source, patterns []meta.Patter if err != nil { return false, err } - if !dup { + // Тот же файл, перечитанный в тот же трек, заново разбирает исполнителей: правила разбора меняются. + sameTrack := dup && r.oldTrack != nil && *r.oldTrack == trackID + if !dup || sameTrack { // Перечитанный файл сохраняет свой трек (лайки, история); новый — получает новый. if r.oldTrack != nil { trackID = *r.oldTrack @@ -445,7 +453,7 @@ func (sc *Scanner) apply(ctx context.Context, src Source, patterns []meta.Patter if trackID, err = sc.store.SaveTrack(ctx, trackID, in); err != nil { return false, err } - credits := meta.SplitArtists(m.Artist, func(k string) bool { return sc.store.ArtistKeyExists(ctx, k) }) + credits := meta.SplitArtists(m.Artist, known) ids := make([]uuid.UUID, 0, len(credits)) roles := make([]string, 0, len(credits)) for _, c := range credits {