Diashow completeness rewrite so every eligible upload is shown regardless of
bursts, disconnects, or library size:
- queue.ts: SlideQueue with live/shuffle queues, allKnown map, recentlyShown
ring; merge(dedup, live-first), remove/removeByUser (prunes recentlyShown),
knownIds for reconcile-eviction. Adds queue.test.ts (burst/completeness/race).
- diashow/+page.svelte: reconcile (full paginate + evict, pre-scan snapshot to
spare concurrent uploads) on mount/reconnect/periodic; catchUpNew paginate-
until-known for bursts with debounced maxWait; hard-cut removals; decode
timeout + candidate fallback + bounded skip so a broken image never stalls.
New ~2048px "display" derivative for big-screen sharpness, decoupled from the
data-saver preview (800px) used on phones:
- migration 016: upload.display_path + v_feed rebuilt (DROP+CREATE, not REPLACE,
to slot the column beside preview/thumbnail).
- compression: generate_image_derivatives emits preview+display (downscale-only
guard, no upscaling); backfill_missing_display regenerates on startup (safe:
logs on error, never soft-deletes).
- upload.rs/main.rs: GET /upload/{id}/display (mirrors preview auth/cache),
/media/displays direct-serve blocked.
- feed.rs + types.ts: display_url in feed/delta DTOs.
- diashow candidate chain: display -> original -> preview.
Verified on the running stack: migration applied, 10/10 existing images
backfilled (2048px cap honoured, small images not upscaled), /display serves
200, /feed returns display_url, diashow cycles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
35 lines
1.3 KiB
SQL
35 lines
1.3 KiB
SQL
-- Display derivative: a big-screen-quality image (~2048px long edge) for the diashow.
|
|
-- The 800px `preview_path` is sized for phone feeds (data saver); upscaled on a projector
|
|
-- it looks soft. The diashow uses `display_path` instead — bounded in size (safe to decode
|
|
-- on weak kiosk hardware) yet sharp on 1080p/4K. NULL until the compression worker (or the
|
|
-- one-time backfill) generates it; consumers fall back to the original when absent.
|
|
ALTER TABLE upload ADD COLUMN display_path TEXT;
|
|
|
|
-- Recreate (not CREATE OR REPLACE, which only allows appending columns at the end) so the
|
|
-- new column can sit alongside preview_path/thumbnail_path.
|
|
DROP VIEW IF EXISTS v_feed;
|
|
CREATE VIEW v_feed AS
|
|
SELECT
|
|
u.id,
|
|
u.event_id,
|
|
u.user_id,
|
|
usr.display_name AS uploader_name,
|
|
usr.is_banned,
|
|
usr.uploads_hidden,
|
|
u.preview_path,
|
|
u.thumbnail_path,
|
|
u.display_path,
|
|
u.mime_type,
|
|
u.caption,
|
|
u.created_at,
|
|
COUNT(DISTINCT l.user_id) AS like_count,
|
|
COUNT(DISTINCT c.id) AS comment_count
|
|
FROM upload u
|
|
JOIN "user" usr ON u.user_id = usr.id
|
|
LEFT JOIN "like" l ON l.upload_id = u.id
|
|
LEFT JOIN comment c ON c.upload_id = u.id AND c.deleted_at IS NULL
|
|
WHERE u.deleted_at IS NULL
|
|
AND usr.uploads_hidden = FALSE
|
|
AND usr.is_banned = FALSE
|
|
GROUP BY u.id, usr.display_name, usr.is_banned, usr.uploads_hidden;
|