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), } }