diff --git a/allstarr/Controllers/JellyfinController.cs b/allstarr/Controllers/JellyfinController.cs index 93b91bb..e781e0e 100644 --- a/allstarr/Controllers/JellyfinController.cs +++ b/allstarr/Controllers/JellyfinController.cs @@ -1621,6 +1621,16 @@ public class JellyfinController : ControllerBase { try { + // Check cache first (1 hour TTL for playlist images since they can change) + var cacheKey = $"playlist:image:{playlistId}"; + var cachedImage = await _cache.GetAsync(cacheKey); + + if (cachedImage != null) + { + _logger.LogDebug("Serving cached playlist image for {PlaylistId}", playlistId); + return File(cachedImage, "image/jpeg"); + } + var (provider, externalId) = PlaylistIdHelper.ParsePlaylistId(playlistId); var playlist = await _metadataService.GetPlaylistAsync(provider, externalId); @@ -1637,6 +1647,11 @@ public class JellyfinController : ControllerBase var imageBytes = await response.Content.ReadAsByteArrayAsync(); var contentType = response.Content.Headers.ContentType?.ToString() ?? "image/jpeg"; + + // Cache for 1 hour (playlists can change, so don't cache too long) + await _cache.SetAsync(cacheKey, imageBytes, TimeSpan.FromHours(1)); + _logger.LogDebug("Cached playlist image for {PlaylistId}", playlistId); + return File(imageBytes, contentType); } catch (Exception ex) diff --git a/allstarr/Controllers/SubSonicController.cs b/allstarr/Controllers/SubSonicController.cs index 19cf510..ef75482 100644 --- a/allstarr/Controllers/SubSonicController.cs +++ b/allstarr/Controllers/SubSonicController.cs @@ -559,6 +559,16 @@ public class SubsonicController : ControllerBase { try { + // Check cache first (1 hour TTL for playlist images since they can change) + var cacheKey = $"playlist:image:{id}"; + var cachedImage = await _cache.GetAsync(cacheKey); + + if (cachedImage != null) + { + _logger.LogDebug("Serving cached playlist cover art for {Id}", id); + return File(cachedImage, "image/jpeg"); + } + var (provider, externalId) = PlaylistIdHelper.ParsePlaylistId(id); var playlist = await _metadataService.GetPlaylistAsync(provider, externalId); @@ -576,6 +586,11 @@ public class SubsonicController : ControllerBase var imageBytes = await imageResponse.Content.ReadAsByteArrayAsync(); var contentType = imageResponse.Content.Headers.ContentType?.ToString() ?? "image/jpeg"; + + // Cache for 1 hour (playlists can change, so don't cache too long) + await _cache.SetAsync(cacheKey, imageBytes, TimeSpan.FromHours(1)); + _logger.LogDebug("Cached playlist cover art for {Id}", id); + return File(imageBytes, contentType); } catch (Exception ex)