thumbnail/CachingThumbnailer.go

57 lines
1.1 KiB
Go

package thumbnail
import (
"mime"
"path/filepath"
lru "github.com/hashicorp/golang-lru"
)
type CachingThumbnailer struct {
t Thumbnailer
cache *lru.Cache // threadsafe, might be nil
}
var _ Thumbnailer = &CachingThumbnailer{} // interface assertion
func NewCachingThumbnailer(cacheSize int, opts *Config) (Thumbnailer, error) {
upstream := NewThumbnailerEx(opts)
if cacheSize == 0 {
return upstream, nil
}
thumbCache, err := lru.New(cacheSize)
if err != nil {
return nil, err
}
return &CachingThumbnailer{
t: upstream,
cache: thumbCache,
}, nil
}
func (this *CachingThumbnailer) RenderFile(absPath string) ([]byte, error) {
mimeType := mime.TypeByExtension(filepath.Ext(absPath))
return this.RenderFileAs(absPath, mimeType)
}
func (this *CachingThumbnailer) RenderFileAs(absPath, mimeType string) ([]byte, error) {
thumb, ok := this.cache.Get(absPath)
if ok {
return thumb.([]byte), nil
}
// Add to cache
rendered, err := this.t.RenderFile(absPath)
if err != nil {
return nil, err
}
this.cache.Add(absPath, rendered)
return rendered, nil
}