From 4c3d572eb850c32a45ec9cbaf82688d45c1eebf4 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Tue, 24 Jun 2025 19:16:36 -0500 Subject: add ability to change out albums list during runtime --- immich.py | 2 +- lazycachelist.py | 18 +++++++++++++++--- manager.py | 17 ++++++++++++----- renderer.py | 1 + 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/immich.py b/immich.py index 0f319c5..8c4f3e6 100644 --- a/immich.py +++ b/immich.py @@ -54,7 +54,7 @@ class ImmichConnector: size = "preview" # TODO while True: texture_list, image_texture = self.texture_load_queue.get() - if not texture_list.index_in_cache_range(image_texture.asset_index): + if not texture_list.index_in_cache_range(image_texture.asset_index) or texture_list.void: continue # Texture was never loaded so it doesn't need to be free'd image_data, _ = self.load_image(image_texture.asset_key, size) image_texture.initialize(image_data) diff --git a/lazycachelist.py b/lazycachelist.py index 99212ab..b4d003a 100644 --- a/lazycachelist.py +++ b/lazycachelist.py @@ -39,13 +39,12 @@ class CallbackStateData: class LazyCachingTextureList(): def __init__(self, album_ids, max_cache_items=100, change_callback=None): self.immich_connector = PixMan().immich_connector + self.void = False assert max_cache_items >= 20, "Minimum cache items is 20" # Double small radius # Ring buffer - self.cache_length = max_cache_items - self.cache = [None] * max_cache_items + self.max_cache_items = max_cache_items self.radius_small = 10 - self.radius_large = int(max_cache_items / 2) self.cache_items_behind = 0 self.cache_items_ahead = 0 self.cache_index = 0 @@ -62,6 +61,19 @@ class LazyCachingTextureList(): self.change_callback = change_callback + @property + def max_cache_items(self): + return self.cache_length + + @max_cache_items.setter + def max_cache_items(self, max_cache_items): + self.cache_length = max_cache_items + self.cache = [None] * max_cache_items + self.radius_large = int(max_cache_items / 2) + + def free(self): + self.void = True + def index_in_cache_range(self, index): index_range_low = (self.asset_index - self.cache_items_behind) % self.asset_count index_range_high = (self.asset_index + self.cache_items_ahead ) % self.asset_count diff --git a/manager.py b/manager.py index 918a0c4..af1e4a7 100644 --- a/manager.py +++ b/manager.py @@ -67,9 +67,7 @@ class PixMan: return # Initialize texture list - change_callback = lambda d: self.socketio.emit("seek", d) - album_keys = [ ] - self.texture_list = LazyCachingTextureList(album_keys, max_cache_items=self.config.max_cache_assets, change_callback=change_callback) + self.update_textures() # Begin downloading images self.t_idle_download = Thread(target=self.immich_connector.idle, daemon=True) @@ -79,6 +77,14 @@ class PixMan: self.display = PixDisplay(self.texture_list) self.display.main({}) # TODO glut args + def update_textures(self): + if self.texture_list: + self.texture_list.free() + change_callback = lambda d: self.socketio.emit("seek", d) + self.texture_list = LazyCachingTextureList(self.config.album_list, max_cache_items=self.config.max_cache_assets, change_callback=change_callback) + if self.display: + self.display.update_textures(self.texture_list) + def update_config(self, config, replace=False): oldconfig = copy.deepcopy(self.config) if replace: @@ -93,8 +99,9 @@ class PixMan: self.display.update_config() if oldconfig.album_list != self.config.album_list: - self.texture_list = LazyCachingTextureList(album_keys) - self.display.update_textures() + self.update_textures() + else: + self.texture_list.max_cache_items = self.config.max_cache_assets # If all goes well self.config.save(self.configfile) diff --git a/renderer.py b/renderer.py index 909ad2b..ae4be12 100644 --- a/renderer.py +++ b/renderer.py @@ -98,6 +98,7 @@ class ImageRenderer: def draw_image(self, tex, win_w, win_h, alpha): glUseProgram(self.shader) glBindVertexArray(self.vao) + # FIXME check if tex.id is None glBindTexture(GL_TEXTURE_2D, tex.id) # Calculate aspect ratios -- cgit v1.2.3