From eb7854bac3dcb1d70023f844e243a41c3a673a21 Mon Sep 17 00:00:00 2001 From: Joren Date: Wed, 22 Jul 2026 22:34:42 +0200 Subject: [PATCH] fix: use all album artists for folder naming --- internal/app/app.go | 49 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/internal/app/app.go b/internal/app/app.go index 4863a54..92a45eb 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -648,10 +648,7 @@ func (m *Main) ripAlbum(ctx context.Context, p provider.Client, source, albumID } albumTitle := titleFromMetadata(albumMeta, albumID) - albumArtist := jsonutil.NestedString(albumMeta, "artist", "name") - if albumArtist == "" { - albumArtist = "Unknown" - } + albumArtist := extractAlbumArtist(albumMeta) releaseDate := jsonutil.StringFromAny(albumMeta["release_date_original"]) if releaseDate == "" { releaseDate = jsonutil.StringFromAny(albumMeta["release_date"]) @@ -1224,10 +1221,7 @@ func (m *Main) trackOutputPath(source, id, title, ext string, d *provider.Downlo if albumID == "" { albumID = id } - albumArtist := jsonutil.NestedString(trackMeta, "album", "artist", "name") - if albumArtist == "" { - albumArtist = jsonutil.NestedString(trackMeta, "performer", "name") - } + albumArtist := extractAlbumArtist(trackMetaAlbum(trackMeta)) albumYear := naming.YearFromDate(jsonutil.StringFromAny(trackMeta["release_date_original"])) if albumYear == "Unknown" { 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") } + +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] + } +}