From 69d9b2d4523f2c4a62d31952b0f389efc2022d60 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Mon, 27 Jul 2026 07:43:02 -0700 Subject: [PATCH] fix(artwork): do not promote artist folder to album folder --- core/artwork/reader_album.go | 18 +++++----- core/artwork/reader_album_test.go | 60 +++++++++++++++++++++++-------- core/artwork/reader_artist.go | 2 +- core/artwork/reader_disc.go | 2 +- core/artwork/reader_mediafile.go | 2 +- 5 files changed, 59 insertions(+), 25 deletions(-) diff --git a/core/artwork/reader_album.go b/core/artwork/reader_album.go index 8ad07773b..c34dc0c96 100644 --- a/core/artwork/reader_album.go +++ b/core/artwork/reader_album.go @@ -37,7 +37,7 @@ func newAlbumArtworkReader(ctx context.Context, artwork *artwork, artID model.Ar if err != nil { return nil, err } - _, imgFiles, imagesUpdateAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, *al) + _, imgFiles, imagesUpdateAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, true, *al) if err != nil { return nil, err } @@ -103,7 +103,7 @@ func (a *albumArtworkReader) fromCoverArtPriority(ctx context.Context, ffmpeg ff return ff } -func loadAlbumFoldersPaths(ctx context.Context, ds model.DataStore, albums ...model.Album) ([]string, []string, *time.Time, error) { +func loadAlbumFoldersPaths(ctx context.Context, ds model.DataStore, includeParent bool, albums ...model.Album) ([]string, []string, *time.Time, error) { var folderIDs []string for _, album := range albums { folderIDs = append(folderIDs, album.FolderIDs...) @@ -113,12 +113,14 @@ func loadAlbumFoldersPaths(ctx context.Context, ds model.DataStore, albums ...mo return nil, nil, nil, err } - parent, err := albumRootParent(ctx, ds, folders, folderIDs) - if err != nil { - return nil, nil, nil, err - } - if parent != nil { - folders = append(folders, *parent) + if includeParent { + parent, err := albumRootParent(ctx, ds, folders, folderIDs) + if err != nil { + return nil, nil, nil, err + } + if parent != nil { + folders = append(folders, *parent) + } } var paths []string diff --git a/core/artwork/reader_album_test.go b/core/artwork/reader_album_test.go index fe4a1a545..02c7b6b00 100644 --- a/core/artwork/reader_album_test.go +++ b/core/artwork/reader_album_test.go @@ -57,7 +57,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(*imagesUpdatedAt).To(Equal(expectedAt)) @@ -85,7 +85,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(3)) @@ -106,7 +106,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(3)) @@ -146,7 +146,7 @@ var _ = Describe("Album Artwork Reader", func() { ImageFiles: []string{"cover.jpg", "back.jpg"}, } - _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(*imagesUpdatedAt).To(Equal(expectedAt)) @@ -175,7 +175,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(1)) @@ -205,7 +205,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(1)) @@ -242,7 +242,7 @@ var _ = Describe("Album Artwork Reader", func() { ImageFiles: []string{"unrelated.jpg"}, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(1)) @@ -279,7 +279,7 @@ var _ = Describe("Album Artwork Reader", func() { ImageFiles: []string{"cover.jpg"}, } - _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(*imagesUpdatedAt).To(Equal(expectedAt)) @@ -302,7 +302,7 @@ var _ = Describe("Album Artwork Reader", func() { }, } - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(1)) @@ -330,13 +330,45 @@ var _ = Describe("Album Artwork Reader", func() { ImageFiles: []string{"cover.jpg"}, } - _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, album) + paths, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(*imagesUpdatedAt).To(Equal(expectedAt)) Expect(imgFiles).To(HaveLen(1)) Expect(imgFiles[0]).To(Equal("Artist/Album/cover.jpg")) Expect(repo.getCallCount).To(Equal(1)) + Expect(paths).To(Equal([]string{"Artist/Album/disc1", "Artist/Album"})) + }) + + It("properly responds whether to add parent or not", func() { + repo.result = []model.Folder{ + { + ID: "folder1", + Path: "Artist", + Name: "Album", + ParentID: "artistFolder", + ImagesUpdatedAt: now, + ImageFiles: []string{}, + }, + } + repo.parentResult = &model.Folder{ + ID: "artistFolder", + Path: ".", + Name: "Artist", + ParentID: "libraryRoot", + ImagesUpdatedAt: expectedAt, + ImageFiles: []string{"folder.jpg"}, + } + + paths, _, _, err := loadAlbumFoldersPaths(ctx, ds, false, album) + + Expect(err).ToNot(HaveOccurred()) + Expect(paths).To(Equal([]string{"Artist/Album"})) + + paths, _, _, err = loadAlbumFoldersPaths(ctx, ds, true, album) + + Expect(err).ToNot(HaveOccurred()) + Expect(paths).To(Equal([]string{"Artist/Album", "Artist"})) }) It("does not include parent images when other albums' audio lives under the parent", func() { @@ -362,7 +394,7 @@ var _ = Describe("Album Artwork Reader", func() { } repo.hasOtherAudio = true - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(BeEmpty()) @@ -389,7 +421,7 @@ var _ = Describe("Album Artwork Reader", func() { } repo.otherAudioErr = errors.New("db connection failed") - _, _, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, _, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).To(MatchError("db connection failed")) }) @@ -415,7 +447,7 @@ var _ = Describe("Album Artwork Reader", func() { } repo.getErr = errors.New("db connection failed") - _, _, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, _, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).To(MatchError("db connection failed")) Expect(repo.getCallCount).To(Equal(1)) @@ -443,7 +475,7 @@ var _ = Describe("Album Artwork Reader", func() { } // parentResult is nil, so Get will return ErrNotFound - _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, album) + _, imgFiles, _, err := loadAlbumFoldersPaths(ctx, ds, true, album) Expect(err).ToNot(HaveOccurred()) Expect(imgFiles).To(HaveLen(1)) diff --git a/core/artwork/reader_artist.go b/core/artwork/reader_artist.go index 37b7b6dee..5226e7ed2 100644 --- a/core/artwork/reader_artist.go +++ b/core/artwork/reader_artist.go @@ -54,7 +54,7 @@ func newArtistArtworkReader(ctx context.Context, artwork *artwork, artID model.A if err != nil { return nil, err } - albumPaths, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, als...) + albumPaths, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, false, als...) if err != nil { return nil, err } diff --git a/core/artwork/reader_disc.go b/core/artwork/reader_disc.go index 0f648c987..0f000cc61 100644 --- a/core/artwork/reader_disc.go +++ b/core/artwork/reader_disc.go @@ -43,7 +43,7 @@ func newDiscArtworkReader(ctx context.Context, a *artwork, artID model.ArtworkID return nil, err } - _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, a.ds, *al) + _, imgFiles, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, a.ds, true, *al) if err != nil { return nil, err } diff --git a/core/artwork/reader_mediafile.go b/core/artwork/reader_mediafile.go index eac3c5e70..cebd3f06a 100644 --- a/core/artwork/reader_mediafile.go +++ b/core/artwork/reader_mediafile.go @@ -27,7 +27,7 @@ func newMediafileArtworkReader(ctx context.Context, artwork *artwork, artID mode if err != nil { return nil, err } - _, _, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, *al) + _, _, imagesUpdatedAt, err := loadAlbumFoldersPaths(ctx, artwork.ds, true, *al) if err != nil { return nil, err }