48 lines
813 B
Go
48 lines
813 B
Go
|
package thumbnail
|
||
|
|
||
|
import (
|
||
|
lru "github.com/hashicorp/golang-lru"
|
||
|
)
|
||
|
|
||
|
type CachingThumbnailer struct {
|
||
|
t Thumbnailer
|
||
|
cache *lru.Cache // threadsafe, might be nil
|
||
|
}
|
||
|
|
||
|
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) {
|
||
|
|
||
|
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
|
||
|
}
|