Use the primary artist for upload destination folders
ci / module boundaries / boundaries (push) Successful in 7s
ci / api / api (push) Successful in 33s
ci / db / db (push) Successful in 1m47s

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Sonnet 5.5 committed 2026-11-03 23:14:48 +03:00
1 parent 3edbf489a3
commit 5d0decbb2a
3 files changed
+19 -2

No files matched your search

+12 -1
View File
@@ -81,6 +81,17 @@ type Meta struct {
Disc *int `json:"disc,omitempty"`
}
// PrimaryArtist — первый исполнитель альбома (при пустом album artist — трека; « & » имя не делит): «A;B» и «A feat. B»
// лежат в папке «A», как и в каталоге, где альбом принадлежит первому исполнителю.
func (m Meta) PrimaryArtist() string {
for _, field := range []string{m.AlbumArtist, m.Artist} {
if credits := meta.SplitArtists(field, func(string) bool { return true }); len(credits) > 0 {
return credits[0].Name
}
}
return ""
}
// Fields — значения для шаблона пути.
func (m Meta) Fields() meta.Fields {
num := func(p *int) string {
@@ -90,7 +101,7 @@ func (m Meta) Fields() meta.Fields {
return strconv.Itoa(*p)
}
return meta.Fields{
Artist: m.Artist, AlbumArtist: m.AlbumArtist, Album: m.Album, Title: m.Title, Genre: m.Genre,
Artist: m.Artist, AlbumArtist: m.PrimaryArtist(), Album: m.Album, Title: m.Title, Genre: m.Genre,
Year: num(m.Year), Track: num(m.Track), Disc: num(m.Disc),
}
}
+1 -1
View File
@@ -123,7 +123,7 @@ func (s *PlacementPlanner) plan(ctx context.Context, f File, m Meta, chosen *uui
pl placement
discs int // дисков в альбоме: в каталоге, в пачке, у самого файла
)
if artist, album, maxDisc, err := s.store.MatchCatalog(ctx, meta.Key(m.AlbumArtist), meta.Key(m.Album)); err == nil {
if artist, album, maxDisc, err := s.store.MatchCatalog(ctx, meta.Key(m.PrimaryArtist()), meta.Key(m.Album)); err == nil {
pl.ArtistID, pl.AlbumID, discs = artist, album, maxDisc
}
src, reason := s.pickSource(ctx, chosen)
@@ -24,3 +24,9 @@ func TestSidecarDirs(t *testing.T) {
require.Empty(t, album)
require.Empty(t, artist)
}
func TestPrimaryArtistKeepsFeaturingInFirstArtistFolder(t *testing.T) {
require.Equal(t, "BOULEVARD DEPO", Meta{AlbumArtist: "BOULEVARD DEPO;JEEMBO"}.PrimaryArtist())
require.Equal(t, "BOULEVARD DEPO", Meta{Artist: "BOULEVARD DEPO feat. SP4K"}.PrimaryArtist())
require.Equal(t, "Simon & Garfunkel", Meta{AlbumArtist: "Simon & Garfunkel"}.Fields().AlbumArtist)
}