Use the primary artist for upload destination folders
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3edbf489a3
commit
5d0decbb2a
3 files changed
+19
-2
No files matched your search
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in new issue
Block a user