feat(core/artwork/read_playlist.go): Custom Playlist Art - #406

Adds ability customise playlist art by adding image file with matching name to playlists folder

Signed-off-by: ShadowsDieThrice <140675814+ShadowsDieThrice@users.noreply.github.com>
This commit is contained in:
Elliot 2025-02-17 10:31:00 +08:00 committed by GitHub
parent 46a963a02a
commit 28387d07e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -8,8 +8,11 @@ import (
"image/draw"
"image/png"
"io"
"os"
"path/filepath"
"time"
"github.com/navidrome/navidrome/conf"
"github.com/disintegration/imaging"
"github.com/navidrome/navidrome/log"
"github.com/navidrome/navidrome/model"
@ -44,12 +47,40 @@ func (a *playlistArtworkReader) LastUpdated() time.Time {
func (a *playlistArtworkReader) Reader(ctx context.Context) (io.ReadCloser, string, error) {
ff := []sourceFunc{
a.fromPlaylistNamedCover(ctx),
a.fromGeneratedTiledCover(ctx),
fromAlbumPlaceholder(),
}
return selectImageReader(ctx, a.artID, ff...)
}
func (a *playlistArtworkReader) fromPlaylistNamedCover(ctx context.Context) sourceFunc {
return func() (io.ReadCloser, string, error) {
playlistName := a.pl.Name
imagePath, err := findMatchingImage(playlistName)
if err != nil {
return nil, "", err
}
file, err := os.Open(imagePath)
if err != nil {
return nil, "", err
}
return file, filepath.Ext(imagePath), nil
}
}
func findMatchingImage(playlistName string) (string, error) {
extensions := []string{".png", ".jpg", ".jpeg"}
for _, ext := range extensions {
mediaFolder := conf.Server.MusicFolder
path := filepath.Join(mediaFolder, "/zPlaylists", playlistName+ext)
if _, err := os.Stat(path); err == nil {
return path, nil
}
}
return "", errors.New("no matching image found")
}
func (a *playlistArtworkReader) fromGeneratedTiledCover(ctx context.Context) sourceFunc {
return func() (io.ReadCloser, string, error) {
tiles, err := a.loadTiles(ctx)