-
Replaces the single "← 返回直播频道" link (which only pointed at live.html) with two explicit links — 视频直播间 (live.html) and 跳舞直播间 (dance.html) — each opening in a new tab so the admin doesn't lose their place in the library table. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DUiYs6UjxDMkfvnjtsKFo
-
preload="none" left every row's player a plain black box until clicked, giving no way to eyeball which clip is which without playing it. Switch to preload="metadata" (browsers paint the first frame once metadata loads, without playing) so the row itself doubles as a thumbnail. Load it lazily via IntersectionObserver rather than src'ing all 361 rows on page load — /lib/video/:id has no local cache and re-proxies to H3 Console on every hit, so firing that many requests at once would hammer it; only rows actually scrolled into view pull their frame. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DUiYs6UjxDMkfvnjtsKFo
-
The modal (previous commit) meant an extra click and a popup just to see the clip. Swap it for a native <video controls preload="none"> directly in the 预览 column — preload="none" keeps the 361-row table from firing off thumbnails for every row on load, and clicking the player's own play button starts it right there, no dialog involved. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DUiYs6UjxDMkfvnjtsKFo
-
Browsing a clip previously meant opening /lib/video/:id in a new tab via the raw address link. Add a 预览 button per row that opens a native <dialog> with an inline <video> player instead — closes on Esc, backdrop click, or its own close button, and clears the src on close so playback/buffering stops. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DUiYs6UjxDMkfvnjtsKFo
-
live.html and dance.html already have independent scheduling pools (architecture.md 2.1), distinguished by clips' channel field, but admin.html rendered everything as one flat table with no way to tell the two apart or scope edits to one room. Add a 视频直播间/跳舞直播间 tab switcher that filters the table by channel, lets manual adds pick which room they land in, and lets existing rows be reclassified via the edit form's new channel select (backed by server.js's existing channel support on POST/PATCH /api/admin/library, committed in e96d689 as part of an unrelated concurrent session's work). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DUiYs6UjxDMkfvnjtsKFo
-
Fetches characters/garments/dance-refs alongside the library on load and joins each clip's characterId/garmentId/refDanceVideoId back to their names, so an operator can see "谁的脸 + 谁的衣服 + 哪条参考视频" per row (M.7). No composedImageId column — the one-step pipeline never produces an intermediate composed image. Extends the dressup-generate.test.js happy-path test to confirm the join resolves real names, not just matching ids. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
POST /api/admin/batch-gen takes {characterId, garmentIds[], refDanceVideoIds?[]}, expands to one job per garment (cross-producted with refDanceVideoIds when given, else one random active dance-ref per garment like the single-generate default), and submits each through the same submitGeneration() helper the single POST /api/admin/generate route now uses — so the M.7 dedupe cache (existing characterId+ garmentId combo) is honored per combo, not just per batch. GET /api/admin/batch-gen/status?batchId= returns that batch's generationJobs records for progress polling. admin-batch-gen.html: pick one character, multiple garments, and optionally pin specific reference dances; submits the batch, polls status every 3s into a progress table, and lets failed rows be retried individually via POST /api/admin/generate. Linked from the other admin pages' nav. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> -
Table + inline edit + add-form pages matching admin.html's existing conventions, wired to the T3-T5 CRUD API and T2's upload endpoints. Cross-linked with admin.html and each other in the topbar. No browser tooling available in this environment to render/click through these, so admin-pages-flow.test.js exercises the exact API call sequence each page's JS performs (login -> upload a real file -> create with the returned URL -> list -> confirm the shape the table renders), which is where a field-name mismatch would surface.
-
Single shared password (.env ADMIN_PASSWORD) + in-memory HttpOnly session cookie, no accounts/roles — MVCP M.1/M.10's real account system supersedes this in period 3. Covers the existing /api/admin/library/* routes (previously unauthenticated, see architecture.md 1.2's tech-debt note) plus the new upload endpoint. admin.html gets a fetch() interceptor that redirects to the new admin-login.html on any 401 from /api/admin/*, rather than patching every call site.
-
Static video-gen testing tool (MiniMax native API, then fal.ai) that grew into an AI drama live channel backed by an internal H3 Console GPU cluster: shared virtual-playhead live playback, prompt submit/match/generate queue, admin CRUD for the video library, and bilingual (zh/en) semantic clip names. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>