mirror of
https://github.com/navidrome/navidrome.git
synced 2025-05-27 21:59:31 +03:00
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:
parent
46a963a02a
commit
28387d07e2
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user