refresh cached cover image on access if older than 24 hours

This commit is contained in:
Drew Weymouth
2023-01-14 11:05:58 -08:00
parent b47bf6d000
commit f1daea8af3
+23 -10
View File
@@ -8,6 +8,7 @@ import (
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"time"
"github.com/20after4/configdir" "github.com/20after4/configdir"
"github.com/bluele/gcache" "github.com/bluele/gcache"
@@ -48,12 +49,10 @@ func (i *ImageManager) GetAlbumThumbnail(albumID string) (image.Image, error) {
} }
// on disc cache // on disc cache
path := filepath.Join(i.ensureCoverCacheDir(), fmt.Sprintf("%s.jpg", albumID)) path := i.filePathForCover(albumID)
if i.ensureCoverCacheDir() != "" { if i.ensureCoverCacheDir() != "" {
if _, err := os.Stat(path); err == nil { if s, err := os.Stat(path); err == nil {
// serve image from on-disc cache go i.checkRefreshLocalCover(s, albumID)
// TODO: image may have changed on server.
// first, return cached image, then fetch fresh img from server in background
if f, err := os.Open(path); err == nil { if f, err := os.Open(path); err == nil {
defer f.Close() defer f.Close()
if img, _, err := image.Decode(f); err == nil { if img, _, err := image.Decode(f); err == nil {
@@ -64,12 +63,22 @@ func (i *ImageManager) GetAlbumThumbnail(albumID string) (image.Image, error) {
} }
} }
// fetch from server return i.fetchAndCacheCoverFromServer(albumID)
}
func (i *ImageManager) ensureCoverCacheDir() string {
path := path.Join(i.baseCacheDir, i.s.ServerID.String(), "covers")
configdir.MakePath(path)
return path
}
func (i *ImageManager) fetchAndCacheCoverFromServer(albumID string) (image.Image, error) {
img, err := i.s.Server.GetCoverArt(albumID, map[string]string{"size": "300"}) img, err := i.s.Server.GetCoverArt(albumID, map[string]string{"size": "300"})
if err != nil { if err != nil {
return nil, err return nil, err
} }
if i.ensureCoverCacheDir() != "" { if i.ensureCoverCacheDir() != "" {
path := i.filePathForCover(albumID)
if f, err := os.Create(path); err == nil { if f, err := os.Create(path); err == nil {
defer f.Close() defer f.Close()
if err := jpeg.Encode(f, img, nil /*options*/); err != nil { if err := jpeg.Encode(f, img, nil /*options*/); err != nil {
@@ -81,8 +90,12 @@ func (i *ImageManager) GetAlbumThumbnail(albumID string) (image.Image, error) {
return img, nil return img, nil
} }
func (i *ImageManager) ensureCoverCacheDir() string { func (i *ImageManager) checkRefreshLocalCover(stat os.FileInfo, albumID string) {
path := path.Join(i.baseCacheDir, i.s.ServerID.String(), "covers") if time.Now().Sub(stat.ModTime()) > 24*time.Hour {
configdir.MakePath(path) i.fetchAndCacheCoverFromServer(albumID)
return path }
}
func (i *ImageManager) filePathForCover(albumID string) string {
return filepath.Join(i.ensureCoverCacheDir(), fmt.Sprintf("%s.jpg", albumID))
} }