add cache warming for album covers to album iterators

This commit is contained in:
Drew Weymouth
2023-01-07 16:24:18 -08:00
parent 5722c18d36
commit 584a160809
7 changed files with 55 additions and 21 deletions
+16
View File
@@ -14,6 +14,8 @@ type AlbumIterator interface {
}
type LibraryManager struct {
PreCacheCoverFn func(string)
s *ServerManager
albumDetailCache gcache.Cache
}
@@ -153,6 +155,11 @@ func (r *baseIter) Next() *subsonic.AlbumID3 {
}
r.prefetched = albums
r.prefetchedPos = 1
if r.l.PreCacheCoverFn != nil {
for _, album := range albums {
go r.l.PreCacheCoverFn(album.ID)
}
}
return r.prefetched[0]
}
@@ -277,6 +284,9 @@ func (s *searchIter) addNewAlbums(al []*subsonic.AlbumID3) {
continue
}
s.prefetched = append(s.prefetched, album)
if s.l.PreCacheCoverFn != nil {
go s.l.PreCacheCoverFn(album.ID)
}
s.albumIDset[album.ID] = true
}
}
@@ -328,6 +338,9 @@ func (r *randomIter) Next() *subsonic.AlbumID3 {
for _, album := range albums {
if _, ok := r.albumIDSet[album.ID]; !ok {
r.prefetched = append(r.prefetched, album)
if r.l.PreCacheCoverFn != nil {
go r.l.PreCacheCoverFn(album.ID)
}
r.albumIDSet[album.ID] = true
}
}
@@ -346,6 +359,9 @@ func (r *randomIter) Next() *subsonic.AlbumID3 {
if _, ok := r.albumIDSet[album.ID]; !ok {
hitCount++
r.prefetched = append(r.prefetched, album)
if r.l.PreCacheCoverFn != nil {
go r.l.PreCacheCoverFn(album.ID)
}
r.albumIDSet[album.ID] = true
}
}
+3
View File
@@ -51,6 +51,9 @@ func StartupApp() (*App, error) {
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.Player)
a.LibraryManager = NewLibraryManager(a.ServerManager)
a.ImageManager = NewImageManager(a.ServerManager, configdir.LocalCache(AppName))
a.LibraryManager.PreCacheCoverFn = func(albumID string) {
_, _ = a.ImageManager.GetAlbumThumbnail(albumID)
}
return a, nil
}
+7
View File
@@ -32,6 +32,13 @@ func NewImageManager(s *ServerManager, baseCacheDir string) *ImageManager {
}
}
func (i *ImageManager) GetAlbumThumbnailFromCache(albumID string) (image.Image, bool) {
if img, err := i.thumbnailCache.Get(albumID); err == nil && img != nil {
return img.(image.Image), true
}
return nil, false
}
func (i *ImageManager) GetAlbumThumbnail(albumID string) (image.Image, error) {
// in-memory cache
if i.thumbnailCache.Has(albumID) {