Make the upcoming-photos queue length user-configurable
Build and push server image / build-and-push (push) Successful in 42s
Build and push server image / build-and-push (push) Successful in 42s
Adds "Upcoming photos to show" to the config UI (queue_target_len, 5-50, default 20, replacing the hardcoded QUEUE_TARGET_LEN constant). Lowering it trims the queue immediately on next page load rather than waiting for enough advances to consume the excess naturally; raising it tops back up the same way, via a new photo_queue.sync_queue_length() called from GET /api/queue.
This commit is contained in:
@@ -8,9 +8,10 @@ photo instead of silently skipping ahead) or an explicit forced advance
|
||||
button -- ignoring elapsed time).
|
||||
|
||||
`queue` is a small reorderable lookahead the web UI can preview and
|
||||
rearrange, topped up automatically from the album as it's consumed.
|
||||
`queue_cursor` is separate, internal-only bookkeeping for where sequential
|
||||
top-up resumes in the album -- not shown or reordered in the UI.
|
||||
rearrange, topped up (or trimmed) automatically to match
|
||||
`cfg.queue_target_len` (user-configurable from the web UI) as it's
|
||||
consumed. `queue_cursor` is separate, internal-only bookkeeping for where
|
||||
sequential top-up resumes in the album -- not shown or reordered in the UI.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -20,14 +21,20 @@ import time
|
||||
|
||||
from .config import FrameConfig
|
||||
|
||||
QUEUE_TARGET_LEN = 24
|
||||
|
||||
|
||||
def _top_up(cfg: FrameConfig, assets: list[dict]) -> None:
|
||||
valid_ids = {a["id"] for a in assets}
|
||||
cfg.queue = [asset_id for asset_id in cfg.queue if asset_id in valid_ids]
|
||||
|
||||
needed = QUEUE_TARGET_LEN - len(cfg.queue)
|
||||
target = cfg.queue_target_len
|
||||
if len(cfg.queue) > target:
|
||||
# Target was lowered since this queue was built -- shrink it
|
||||
# immediately rather than waiting for enough advances to consume
|
||||
# the excess naturally.
|
||||
cfg.queue = cfg.queue[:target]
|
||||
return
|
||||
|
||||
needed = target - len(cfg.queue)
|
||||
if needed <= 0 or not assets:
|
||||
return
|
||||
|
||||
@@ -72,13 +79,21 @@ def advance_forced(cfg: FrameConfig, assets: list[dict]) -> None:
|
||||
# only asset is already current) -- keep showing what we have.
|
||||
cfg.current_asset_id = assets[0]["id"]
|
||||
cfg.current_asset_set_at = time.time()
|
||||
# Refill back up to QUEUE_TARGET_LEN now that current_asset_id has
|
||||
# Refill back up to queue_target_len now that current_asset_id has
|
||||
# changed -- otherwise the queue is left one short until the *next*
|
||||
# advance, since the pop above consumes one of the items _top_up just
|
||||
# added.
|
||||
_top_up(cfg, assets)
|
||||
|
||||
|
||||
def sync_queue_length(cfg: FrameConfig, assets: list[dict]) -> None:
|
||||
"""Tops up or trims cfg.queue to match cfg.queue_target_len without
|
||||
otherwise touching current_asset_id. Used by GET /api/queue so a
|
||||
change to the "upcoming photos to show" setting takes effect on page
|
||||
load rather than waiting for the next natural advance."""
|
||||
_top_up(cfg, assets)
|
||||
|
||||
|
||||
def get_current(cfg: FrameConfig, assets: list[dict]) -> bool:
|
||||
"""Time-based, idempotent path used by GET /frame/image. Advances only
|
||||
if the current photo is unset/invalid or refresh_interval_s has
|
||||
|
||||
Reference in New Issue
Block a user