fix(library): split compound album artist and re-split artists on rescan
ci / api / api (push) Successful in 37s
ci / db / db (push) Successful in 55s

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Sonnet 5.5 committed 2026-10-28 14:29:50 +03:00
1 parent 8a007be036
commit 75f9c57eca
1 file changed
+11 -3
+11 -3
View File
@@ -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 {