feat(artwork): hydrate the parent album's artwork state onto tracks

This commit is contained in:
Deluan 2026-07-23 20:01:04 -04:00
parent 9bb685a6af
commit f9aaff7d7f
3 changed files with 30 additions and 0 deletions

View File

@ -26,6 +26,10 @@ type MediaFile struct {
Bookmarkable `structs:"-" hash:"ignore"`
ItemImage `structs:"-" hash:"ignore"`
// AlbumImage is the parent album's artwork state, hydrated alongside the track's own so a
// song's Jellyfin album-art tag can be pixel-versioned without a second query.
AlbumImage ItemImage `structs:"-" json:"-" hash:"ignore"`
ID string `structs:"id" json:"id" hash:"ignore"`
PID string `structs:"pid" json:"-" hash:"ignore"`
LibraryID int `structs:"library_id" json:"libraryId" hash:"ignore"`

View File

@ -241,6 +241,7 @@ func (r *mediaFileRepository) hydrateArtwork(mfs model.MediaFiles) {
mfInfos := hydrateItemImages(r.ctx, r.db, model.KindMediaFileArtwork.Prefix(), eligibleIDs)
for i := range mfs {
mf := &mfs[i]
applyItemImage(albumInfos, mf.AlbumID, &mf.AlbumImage)
eligible := mf.HasCoverArt && conf.Server.EnableMediaFileCoverArt
ownInfo, ownResolved := mfInfos[mf.ID]
if eligible && ownResolved && !ownInfo.Absent() {

View File

@ -1093,4 +1093,29 @@ var _ = Describe("MediaRepository", func() {
_ = mr.Delete(newID)
})
})
Describe("AlbumImage hydration", func() {
It("carries the parent album's artwork state onto each track", func() {
mfs := model.MediaFiles{{ID: "mf-1", AlbumID: "al-1"}}
infos := map[string]model.ItemArtworkInfo{
"al-1": {ItemID: "al-1", Hash: "0123456789abcdef", BlurHash: "LEHV6nWB2yk8"},
}
applyItemImage(infos, mfs[0].AlbumID, &mfs[0].AlbumImage)
Expect(mfs[0].AlbumImage.ImageHash).To(Equal("0123456789abcdef"))
Expect(mfs[0].AlbumImage.BlurHash).To(Equal("LEHV6nWB2yk8"))
Expect(mfs[0].AlbumImage.ImageAbsent).To(BeFalse())
})
It("keeps the album state independent of the track's own art", func() {
mf := model.MediaFile{ID: "mf-2", AlbumID: "al-2"}
mf.ImageHash = "aaaaaaaaaaaaaaaa" // the track's own art
applyItemImage(
map[string]model.ItemArtworkInfo{"al-2": {ItemID: "al-2", Hash: "bbbbbbbbbbbbbbbb"}},
mf.AlbumID, &mf.AlbumImage,
)
Expect(mf.ImageHash).To(Equal("aaaaaaaaaaaaaaaa"))
Expect(mf.AlbumImage.ImageHash).To(Equal("bbbbbbbbbbbbbbbb"))
})
})
})