feat(studio): per-scene loop plays on hover (scene.demo end-to-end)

Wires the per-scene loop video all the way to the scene card:
- studio-svc: SavedSceneResponse now includes Demo (was stored + copied but never
  serialized); MapSceneResponse passes s.Demo.
- Scene type gains image?/demo?; parseScene reads them from the loaded scene data.
- SceneThumbnailBlock shows scene.image as the still and plays scene.demo (muted,
  looped) on hover, resetting on mouse-leave.

Existing projects backfilled (saved_scenes.image/demo from content.scenes). Both
services rebuilt + deployed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-24 21:46:07 +03:30
parent e4fd936953
commit 055d8365fe
5 changed files with 35 additions and 4 deletions
@@ -473,7 +473,7 @@ public class StudioService(StudioDbContext db)
);
private static SavedSceneResponse MapSceneResponse(SavedScene s) => new(
s.Id, s.OriginalSceneId, s.Key, s.Title, s.Image, s.SceneType,
s.Id, s.OriginalSceneId, s.Key, s.Title, s.Image, s.Demo, s.SceneType,
s.Sort, s.SceneLengthSec, s.MinDurationSec, s.MaxDurationSec,
s.OverlapAtEndSec, s.CanHandleDuration, s.ManualColorSelection, s.SelectedColorPresetId,
s.Contents.Select(MapContentResponse).ToList(),
@@ -62,6 +62,7 @@ public record SavedSceneResponse(
string Key,
string? Title,
string? Image,
string? Demo,
string SceneType,
int Sort,
decimal SceneLengthSec,