44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def _read_scene(scene: Any) -> tuple[str, str, str]:
|
|
if hasattr(scene, "image_prompt") and hasattr(scene, "video_motion") and hasattr(scene, "narration"):
|
|
return (
|
|
str(getattr(scene, "image_prompt", "")).strip(),
|
|
str(getattr(scene, "video_motion", "")).strip(),
|
|
str(getattr(scene, "narration", "")).strip(),
|
|
)
|
|
if isinstance(scene, dict):
|
|
return (
|
|
str(scene.get("image_prompt", "")).strip(),
|
|
str(scene.get("video_motion", scene.get("motion", ""))).strip(),
|
|
str(scene.get("narration", scene.get("tts", ""))).strip(),
|
|
)
|
|
return ("", "", "")
|
|
|
|
|
|
def scenes_to_shots(scenes: list) -> list[dict[str, Any]]:
|
|
shots: list[dict[str, Any]] = []
|
|
for scene_idx, scene in enumerate(scenes, start=1):
|
|
image_prompt, motion, tts = _read_scene(scene)
|
|
scene_id = f"scene_{scene_idx:02d}"
|
|
shot_id = f"{scene_id}_01"
|
|
# Keep default duration simple and deterministic for MVP.
|
|
duration = 3
|
|
shots.append(
|
|
{
|
|
"shot_id": shot_id,
|
|
"scene_id": scene_id,
|
|
"duration": int(duration),
|
|
"image_prompt": image_prompt,
|
|
"motion": motion,
|
|
"camera": "",
|
|
"tts": tts,
|
|
"status": "pending",
|
|
}
|
|
)
|
|
return shots
|
|
|