summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/src/routes/settings/+page.svelte13
-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
5 files changed, 38 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)
})
</script>
@@ -85,6 +87,15 @@
<option value="fullsize">Original Image</option>
</select>
<div>
+ <label for="order" class="settings-label">Sorting Order</label>
+ <p>Sorting order of images.</p>
+ </div>
+ <select class="my-auto rounded-input" id="order" bind:value={order}>
+ <option value="oldest-first">Oldest to Newest</option>
+ <option value="newest-first">Newest to Oldest</option>
+ <option value="random">Shuffle Random</option>
+ </select>
+ <div>
<label for="max_cache_assets" class="settings-label">Max Cached Assets</label>
<p>Number of assets that can exist at once in RAM.<br>Each asset will take ~10x the display size in memory.</p>
</div>
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