summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Keller <tjk@tjkeller.xyz>2025-06-24 19:16:36 -0500
committerTim Keller <tjk@tjkeller.xyz>2025-06-24 19:16:36 -0500
commit4c3d572eb850c32a45ec9cbaf82688d45c1eebf4 (patch)
treec46c5e7f7d837b548b9e7afe597bc047ba9e0f68
parent2f03f39e24053377dce108e45fde13ccd1e0ae22 (diff)
downloadimmich-frame-4c3d572eb850c32a45ec9cbaf82688d45c1eebf4.tar.xz
immich-frame-4c3d572eb850c32a45ec9cbaf82688d45c1eebf4.zip
add ability to change out albums list during runtime
-rw-r--r--immich.py2
-rw-r--r--lazycachelist.py18
-rw-r--r--manager.py17
-rw-r--r--renderer.py1
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