From f84408bbd4a4c53dc49589b7735aba905efcc848 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Mon, 22 Dec 2025 21:53:33 -0600 Subject: add sorting options with oldest-first as default --- src/client/src/routes/settings/+page.svelte | 13 ++++++++++++- src/server/immich.py | 21 ++++++++++++++++++++- src/server/lazycachelist.py | 5 +---- src/server/manager.py | 4 ++++ src/server/settings.py | 1 + todo | 1 + 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/client/src/routes/settings/+page.svelte b/src/client/src/routes/settings/+page.svelte index a0483a0..d72f19b 100644 --- a/src/client/src/routes/settings/+page.svelte +++ b/src/client/src/routes/settings/+page.svelte @@ -8,6 +8,7 @@ let transition_duration: number = $state() let max_framerate: number = $state() let display_size: string = $state() + let order: string = $state() let max_cache_assets: number = $state() function onsubmit(e: SubmitEvent) { @@ -19,6 +20,7 @@ transition_duration, max_framerate, display_size, + order, max_cache_assets, } apiConnector.updateConfig(config) @@ -28,7 +30,7 @@ const currentConfig: Config = await apiConnector.fetchConfig() ;({ immich_url, immich_api_key, image_duration, transition_duration, - max_framerate, display_size, max_cache_assets, + max_framerate, display_size, order, max_cache_assets, } = currentConfig) }) @@ -84,6 +86,15 @@ +
+ +

Sorting order of images.

+
+

Number of assets that can exist at once in RAM.
Each asset will take ~10x the display size in memory.

diff --git a/src/server/immich.py b/src/server/immich.py index d5c5fd1..84aa7be 100644 --- a/src/server/immich.py +++ b/src/server/immich.py @@ -1,4 +1,5 @@ import requests +import random from io import BytesIO from queue import Queue @@ -32,6 +33,23 @@ class ImmichConnector: data = response.json() return data["assets"] + def load_albums_assets(self, keys): + config = PixMan().config + + assets = [] + for key in keys: + assets += self.load_album_assets(key) + + if config.order == "newest-first" or config.order == "oldest-first": + # NOTE: asset.createdAt is a ISO 8601 date string, which are able to be sorted via python string sorting + assets_sorted = sorted(assets, key=lambda asset: asset["createdAt"], reverse=(config.order == "newest-first")) + elif config.order == "random": + assets_sorted = assets + random.shuffle(assets_sorted) + + assert assets_sorted, f"Invalid config value for 'order': {config.order}" + return assets_sorted + def load_image(self, key, size="preview"): response = self._request(f"assets/{key}/thumbnail?size={size}") if not response or response.status_code != 200: return None, None @@ -51,7 +69,8 @@ class ImmichConnector: self.texture_load_queue.put((texture_list, image_texture)) def idle(self): - size = "preview" # TODO + config = PixMan().config + size = config.display_size while True: texture_list, image_texture = self.texture_load_queue.get() if not texture_list.index_in_cache_range(image_texture.asset_index) or texture_list.void: diff --git a/src/server/lazycachelist.py b/src/server/lazycachelist.py index c224a8c..3975542 100644 --- a/src/server/lazycachelist.py +++ b/src/server/lazycachelist.py @@ -96,10 +96,7 @@ class LazyCachingTextureList(): return albums def _get_album_assets(self): - assets = [] - for album in self.albums: - assets += self.immich_connector.load_album_assets(album.id) - return assets + return self.immich_connector.load_albums_assets(( album.id for album in self.albums )) def _fill_cache(self, current_radius, final_radius, step): if current_radius >= final_radius: diff --git a/src/server/manager.py b/src/server/manager.py index 02363b2..dfabdd3 100644 --- a/src/server/manager.py +++ b/src/server/manager.py @@ -85,6 +85,10 @@ class PixMan: if oldconfig.album_list != self.config.album_list: self.update_textures() + elif oldconfig.order != self.config.order: + self.update_textures() + elif self.config.order == "random" and not replace: # If replace then this would run update_textures() out of order + self.update_textures() elif self.texture_list: self.texture_list.max_cache_items = self.config.max_cache_assets diff --git a/src/server/settings.py b/src/server/settings.py index 49b9876..af23add 100644 --- a/src/server/settings.py +++ b/src/server/settings.py @@ -14,6 +14,7 @@ class Config: max_framerate: float = 30.0 auto_transition: bool = True display_size: str = "preview" # 'fullsize', 'preview', 'thumbnail' + order: str = "oldest-first" # 'oldest-first', 'newest-first', 'random' # Cache max_cache_assets: int = 100 # Albums data diff --git a/todo b/todo index f79c4b9..d78c4c5 100644 --- a/todo +++ b/todo @@ -2,3 +2,4 @@ push current images data on new socket connection opening up decrease size of assets in memory support older opengl versions e.g. for running on older pi's update selected albums + config if it changes in frontend +gl_init textures as needed so that only a few are loaded uncompressed in memory at a time and keep compressed copies for cache -- cgit v1.2.3