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"`
|
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 — значения для шаблона пути.
|
// Fields — значения для шаблона пути.
|
||||||
func (m Meta) Fields() meta.Fields {
|
func (m Meta) Fields() meta.Fields {
|
||||||
num := func(p *int) string {
|
num := func(p *int) string {
|
||||||
@@ -90,7 +101,7 @@ func (m Meta) Fields() meta.Fields {
|
|||||||
return strconv.Itoa(*p)
|
return strconv.Itoa(*p)
|
||||||
}
|
}
|
||||||
return meta.Fields{
|
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),
|
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
|
pl placement
|
||||||
discs int // дисков в альбоме: в каталоге, в пачке, у самого файла
|
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
|
pl.ArtistID, pl.AlbumID, discs = artist, album, maxDisc
|
||||||
}
|
}
|
||||||
src, reason := s.pickSource(ctx, chosen)
|
src, reason := s.pickSource(ctx, chosen)
|
||||||
|
|||||||
@@ -24,3 +24,9 @@ func TestSidecarDirs(t *testing.T) {
|
|||||||
require.Empty(t, album)
|
require.Empty(t, album)
|
||||||
require.Empty(t, artist)
|
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