Create and configure image cache

This commit is contained in:
Deluan
2020-04-04 22:23:20 -04:00
committed by Deluan Quintão
parent d308e7ca46
commit 1bc68c20fc
7 changed files with 54 additions and 11 deletions

View File

@@ -11,24 +11,33 @@ import (
"io"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/deluan/navidrome/conf"
"github.com/deluan/navidrome/consts"
"github.com/deluan/navidrome/log"
"github.com/deluan/navidrome/model"
"github.com/deluan/navidrome/static"
"github.com/dhowden/tag"
"github.com/disintegration/imaging"
"github.com/djherbis/fscache"
"github.com/dustin/go-humanize"
)
type Cover interface {
Get(ctx context.Context, id string, size int, out io.Writer) error
}
type cover struct {
ds model.DataStore
type ImageCache fscache.Cache
func NewCover(ds model.DataStore, cache ImageCache) Cover {
return &cover{ds: ds, cache: cache}
}
func NewCover(ds model.DataStore) Cover {
return &cover{ds}
type cover struct {
ds model.DataStore
cache fscache.Cache
}
func (c *cover) getCoverPath(ctx context.Context, id string) (string, error) {
@@ -116,3 +125,20 @@ func readFromTag(path string) (io.Reader, error) {
}
return bytes.NewReader(picture.Data), nil
}
func NewImageCache() (ImageCache, error) {
cacheSize, err := humanize.ParseBytes(conf.Server.ImageCacheSize)
if err != nil {
cacheSize = consts.DefaultImageCacheSize
}
lru := fscache.NewLRUHaunter(consts.DefaultImageCacheMaxItems, int64(cacheSize), consts.DefaultImageCachePurgeInterval)
h := fscache.NewLRUHaunterStrategy(lru)
cacheFolder := filepath.Join(conf.Server.DataFolder, consts.ImageCacheDir)
log.Info("Creating image cache", "path", cacheFolder, "maxSize", humanize.Bytes(cacheSize),
"cleanUpInterval", consts.DefaultImageCachePurgeInterval)
fs, err := fscache.NewFs(cacheFolder, 0755)
if err != nil {
return nil, err
}
return fscache.NewCacheWithHaunter(fs, h)
}

View File

@@ -22,7 +22,9 @@ type MediaStreamer interface {
NewStream(ctx context.Context, id string, reqFormat string, reqBitRate int) (*Stream, error)
}
func NewMediaStreamer(ds model.DataStore, ffm transcoder.Transcoder, cache fscache.Cache) MediaStreamer {
type TranscodingCache fscache.Cache
func NewMediaStreamer(ds model.DataStore, ffm transcoder.Transcoder, cache TranscodingCache) MediaStreamer {
return &mediaStreamer{ds: ds, ffm: ffm, cache: cache}
}
@@ -205,14 +207,14 @@ func getFinalCachedSize(r fscache.ReadAtCloser) int64 {
return -1
}
func NewTranscodingCache() (fscache.Cache, error) {
func NewTranscodingCache() (TranscodingCache, error) {
cacheSize, err := humanize.ParseBytes(conf.Server.TranscodingCacheSize)
if err != nil {
cacheSize = consts.DefaultTranscodingCacheSize
}
lru := fscache.NewLRUHaunter(consts.DefaultTranscodingCacheMaxItems, int64(cacheSize), consts.DefaultTranscodingCachePurgeInterval)
h := fscache.NewLRUHaunterStrategy(lru)
cacheFolder := filepath.Join(conf.Server.DataFolder, consts.CacheDir)
cacheFolder := filepath.Join(conf.Server.DataFolder, consts.TranscodingCacheDir)
log.Info("Creating transcoding cache", "path", cacheFolder, "maxSize", humanize.Bytes(cacheSize),
"cleanUpInterval", consts.DefaultTranscodingCachePurgeInterval)
fs, err := fscache.NewFs(cacheFolder, 0755)

View File

@@ -18,5 +18,6 @@ var Set = wire.NewSet(
NewMediaStreamer,
transcoder.New,
NewTranscodingCache,
NewImageCache,
NewPlayers,
)