From 795bb7de468d261735233067be6897921b024929 Mon Sep 17 00:00:00 2001 From: mrleo1nid <43583385+mrleo1nid@users.noreply.github.com> Date: Wed, 28 Oct 2026 13:39:32 +0300 Subject: [PATCH] fix(library): split comma-separated main artists Co-Authored-By: Claude Sonnet 5.5 --- services/api/internal/library/meta/meta_test.go | 1 + services/api/internal/library/meta/normalize.go | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/services/api/internal/library/meta/meta_test.go b/services/api/internal/library/meta/meta_test.go index 0763b0b..0ad64ea 100644 --- a/services/api/internal/library/meta/meta_test.go +++ b/services/api/internal/library/meta/meta_test.go @@ -32,6 +32,7 @@ func TestSplitArtists(t *testing.T) { assert.Equal(t, []string{"main:Simon & Garfunkel"}, names(SplitArtists("Simon & Garfunkel", known))) assert.Equal(t, []string{"main:Tom", "main:Jerry"}, names(SplitArtists("Tom & Jerry", known))) assert.Equal(t, []string{"main:A", "main:B"}, names(SplitArtists("A; B", nil))) + assert.Equal(t, []string{"main:A", "main:B", "main:C"}, names(SplitArtists("A, B, C", nil))) assert.Equal(t, []string{"main:A", "feat:B", "feat:C"}, names(SplitArtists("A feat. B & C", nil))) assert.Equal(t, []string{"main:A"}, names(SplitArtists("A / a", nil)), "duplicates by key are dropped") assert.Empty(t, SplitArtists(" ", nil)) diff --git a/services/api/internal/library/meta/normalize.go b/services/api/internal/library/meta/normalize.go index d8f7b31..8a8b6d7 100644 --- a/services/api/internal/library/meta/normalize.go +++ b/services/api/internal/library/meta/normalize.go @@ -57,7 +57,7 @@ type ArtistCredit struct { Role string // main | feat } -// SplitArtists разбирает поле исполнителя на отдельных. « & » делит имя, только если составного +// SplitArtists разбирает поле исполнителя на отдельных. « & » и «, » делят имя, только если составного // исполнителя нет в библиотеке (known), — иначе «Simon & Garfunkel» распался бы на двоих. // Всё после feat./ft. — приглашённые исполнители. func SplitArtists(s string, known func(key string) bool) []ArtistCredit { @@ -85,8 +85,8 @@ func SplitArtists(s string, known func(key string) bool) []ArtistCredit { } } for _, part := range splitAny(main, artistSeparators) { - if strings.Contains(part, " & ") && (known == nil || !known(Key(part))) { - for _, p := range strings.Split(part, " & ") { + if (strings.Contains(part, " & ") || strings.Contains(part, ", ")) && (known == nil || !known(Key(part))) { + for _, p := range splitAny(part, []string{" & ", ", "}) { add(p, "main") } continue