summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/immich.py21
-rw-r--r--src/server/lazycachelist.py5
-rw-r--r--src/server/manager.py4
-rw-r--r--src/server/settings.py1
4 files changed, 26 insertions, 5 deletions
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