107 lines
1.5 KiB
Go
107 lines
1.5 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
"image/jpeg"
|
|
"io/fs"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
type artcache struct {
|
|
artPaths map[string]string
|
|
cacheDir string
|
|
}
|
|
|
|
var ArtCache *artcache
|
|
|
|
func (c *artcache) saveArt(id string, img image.Image) *string {
|
|
path := c.GetPath(id)
|
|
if path != nil {
|
|
return path
|
|
}
|
|
|
|
path = c.saveImage(id, img)
|
|
if path != nil {
|
|
c.artPaths[id] = *path
|
|
}
|
|
|
|
return path
|
|
}
|
|
|
|
func (c *artcache) saveImage(id string, img image.Image) *string {
|
|
filePath := c.filepath(id)
|
|
f, err := os.Create(filePath)
|
|
|
|
defer func() {
|
|
_ = f.Close()
|
|
}()
|
|
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
err = jpeg.Encode(f, img, nil)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return &filePath
|
|
}
|
|
|
|
func (c *artcache) GetPath(id string) *string {
|
|
if path, ok := c.artPaths[id]; ok {
|
|
return &path
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *artcache) GetImage(id string) *image.Image {
|
|
path := c.GetPath(id)
|
|
if path == nil {
|
|
return nil
|
|
}
|
|
|
|
f, err := os.Open(*path)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
defer func() {
|
|
_ = f.Close()
|
|
}()
|
|
|
|
img, err := jpeg.Decode(f)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return &img
|
|
}
|
|
|
|
func (c *artcache) filepath(id string) string {
|
|
return path.Join(c.cacheDir, id+".jpg")
|
|
}
|
|
|
|
func (c *artcache) Destroy() {
|
|
os.RemoveAll(c.cacheDir)
|
|
}
|
|
|
|
func init() {
|
|
tmpDir := os.TempDir()
|
|
cacheDir := path.Join(tmpDir, fmt.Sprintf("subsonic-tui-%d", os.Getpid()))
|
|
|
|
var permissions fs.FileMode = 0o777
|
|
|
|
err := os.Mkdir(cacheDir, permissions)
|
|
if err != nil {
|
|
panic("Failed to create cacheDir")
|
|
}
|
|
|
|
ArtCache = &artcache{
|
|
cacheDir: cacheDir,
|
|
artPaths: make(map[string]string),
|
|
}
|
|
}
|