mirror of
https://github.com/navidrome/navidrome.git
synced 2025-05-29 06:39:28 +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/draw"
|
||||||
"image/png"
|
"image/png"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/navidrome/navidrome/conf"
|
||||||
"github.com/disintegration/imaging"
|
"github.com/disintegration/imaging"
|
||||||
"github.com/navidrome/navidrome/log"
|
"github.com/navidrome/navidrome/log"
|
||||||
"github.com/navidrome/navidrome/model"
|
"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) {
|
func (a *playlistArtworkReader) Reader(ctx context.Context) (io.ReadCloser, string, error) {
|
||||||
ff := []sourceFunc{
|
ff := []sourceFunc{
|
||||||
|
a.fromPlaylistNamedCover(ctx),
|
||||||
a.fromGeneratedTiledCover(ctx),
|
a.fromGeneratedTiledCover(ctx),
|
||||||
fromAlbumPlaceholder(),
|
fromAlbumPlaceholder(),
|
||||||
}
|
}
|
||||||
return selectImageReader(ctx, a.artID, ff...)
|
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 {
|
func (a *playlistArtworkReader) fromGeneratedTiledCover(ctx context.Context) sourceFunc {
|
||||||
return func() (io.ReadCloser, string, error) {
|
return func() (io.ReadCloser, string, error) {
|
||||||
tiles, err := a.loadTiles(ctx)
|
tiles, err := a.loadTiles(ctx)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user