diff --git a/lib/screens/libraries/tabs/library_browse_tab.dart b/lib/screens/libraries/tabs/library_browse_tab.dart index 1a2e0084..1072abcb 100644 --- a/lib/screens/libraries/tabs/library_browse_tab.dart +++ b/lib/screens/libraries/tabs/library_browse_tab.dart @@ -1299,6 +1299,7 @@ class _LibraryBrowseTabState extends BaseLibraryTabState 0 ? scaledWidth.round() : 0, displayHeight: scaledHeight.isFinite && scaledHeight > 0 ? scaledHeight.round() : 0, + imageType: ImageType.poster, ); precacheImage( diff --git a/lib/utils/plex_image_helper.dart b/lib/utils/plex_image_helper.dart index d7c3bb4a..f7019a39 100644 --- a/lib/utils/plex_image_helper.dart +++ b/lib/utils/plex_image_helper.dart @@ -198,16 +198,29 @@ class PlexImageHelper { } } - /// Generates cache-friendly dimensions for memory caching + /// Generates cache-friendly dimensions for memory caching. + /// + /// Max bounds are type-aware so large originals (e.g. failed server + /// transcodes or external EPG images) are capped at a resolution + /// appropriate for the display context. static (int memWidth, int memHeight) getMemCacheDimensions({ required int displayWidth, required int displayHeight, double scaleFactor = 1.0, + ImageType imageType = ImageType.poster, }) { final scaledWidth = (displayWidth * scaleFactor).round(); final scaledHeight = (displayHeight * scaleFactor).round(); - return (scaledWidth.clamp(120, 1200), scaledHeight.clamp(180, 1800)); + final (int maxW, int maxH) = switch (imageType) { + ImageType.poster => (720, 1080), + ImageType.thumb => (960, 540), + ImageType.art => (1920, 1080), + ImageType.logo => (600, 300), + ImageType.avatar => (300, 300), + }; + + return (scaledWidth.clamp(120, maxW), scaledHeight.clamp(180, maxH)); } /// Determines if an image path is suitable for transcoding diff --git a/lib/widgets/plex_optimized_image.dart b/lib/widgets/plex_optimized_image.dart index f44520d4..73a205b0 100644 --- a/lib/widgets/plex_optimized_image.dart +++ b/lib/widgets/plex_optimized_image.dart @@ -329,6 +329,7 @@ class PlexOptimizedImage extends StatelessWidget { final (memWidth, memHeight) = PlexImageHelper.getMemCacheDimensions( displayWidth: scaledWidth.isFinite && scaledWidth > 0 ? scaledWidth.round() : 0, displayHeight: scaledHeight.isFinite && scaledHeight > 0 ? scaledHeight.round() : 0, + imageType: imageType, ); // Generate cache key if not provided