fix: use all album artists for folder naming

This commit is contained in:
2026-07-22 22:34:42 +02:00
parent 5f61b1a3cf
commit eb7854bac3
+41 -8
View File
@@ -648,10 +648,7 @@ func (m *Main) ripAlbum(ctx context.Context, p provider.Client, source, albumID
} }
albumTitle := titleFromMetadata(albumMeta, albumID) albumTitle := titleFromMetadata(albumMeta, albumID)
albumArtist := jsonutil.NestedString(albumMeta, "artist", "name") albumArtist := extractAlbumArtist(albumMeta)
if albumArtist == "" {
albumArtist = "Unknown"
}
releaseDate := jsonutil.StringFromAny(albumMeta["release_date_original"]) releaseDate := jsonutil.StringFromAny(albumMeta["release_date_original"])
if releaseDate == "" { if releaseDate == "" {
releaseDate = jsonutil.StringFromAny(albumMeta["release_date"]) releaseDate = jsonutil.StringFromAny(albumMeta["release_date"])
@@ -1224,10 +1221,7 @@ func (m *Main) trackOutputPath(source, id, title, ext string, d *provider.Downlo
if albumID == "" { if albumID == "" {
albumID = id albumID = id
} }
albumArtist := jsonutil.NestedString(trackMeta, "album", "artist", "name") albumArtist := extractAlbumArtist(trackMetaAlbum(trackMeta))
if albumArtist == "" {
albumArtist = jsonutil.NestedString(trackMeta, "performer", "name")
}
albumYear := naming.YearFromDate(jsonutil.StringFromAny(trackMeta["release_date_original"])) albumYear := naming.YearFromDate(jsonutil.StringFromAny(trackMeta["release_date_original"]))
if albumYear == "Unknown" { if albumYear == "Unknown" {
albumYear = naming.YearFromDate(jsonutil.StringFromAny(trackMeta["release_date"])) albumYear = naming.YearFromDate(jsonutil.StringFromAny(trackMeta["release_date"]))
@@ -1613,3 +1607,42 @@ func isFFmpegMissingError(err error) bool {
} }
return strings.Contains(strings.ToLower(err.Error()), "ffmpeg not found") return strings.Contains(strings.ToLower(err.Error()), "ffmpeg not found")
} }
func extractAlbumArtist(albumMeta map[string]any) string {
if artistsRaw, ok := albumMeta["artists"].([]any); ok {
names := make([]string, 0, len(artistsRaw))
for _, a := range artistsRaw {
artist, ok := a.(map[string]any)
if !ok {
continue
}
if name := jsonutil.StringFromAny(artist["name"]); name != "" {
names = append(names, name)
}
}
if len(names) > 0 {
return displayArtistNames(names)
}
}
if names := stringSliceFromAny(albumMeta["artist_names"]); len(names) > 0 {
return displayArtistNames(names)
}
artist := jsonutil.NestedString(albumMeta, "artist", "name")
if artist != "" {
return artist
}
return "Unknown"
}
func displayArtistNames(names []string) string {
switch len(names) {
case 0:
return ""
case 1:
return names[0]
case 2:
return names[0] + " & " + names[1]
default:
return strings.Join(names[:len(names)-1], ", ") + " & " + names[len(names)-1]
}
}