File size: 1,506 Bytes
55b3b1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from __future__ import annotations

from dataclasses import dataclass, field
from typing import List, Optional


@dataclass
class CharacterSpec:
    identifier: str
    name: str
    role: str
    description: str
    traits: List[str] = field(default_factory=list)
    reference_image: Optional[str] = None

    def to_row(self) -> dict:
        traits = ", ".join(self.traits)
        return {
            "ID": self.identifier,
            "Name": self.name,
            "Role": self.role,
            "Traits": traits or "—",
        }


@dataclass
class SceneBeat:
    scene_id: str
    title: str
    visuals: str
    action: str
    characters: List[str] = field(default_factory=list)
    duration: int = 6
    mood: str = ""
    camera: str = ""

    def to_row(self) -> dict:
        return {
            "Scene": self.scene_id,
            "Title": self.title,
            "Action": self.action,
            "Visuals": self.visuals,
            "Characters": ", ".join(self.characters) or "—",
            "Duration (s)": self.duration,
        }


@dataclass
class Storyboard:
    title: str
    synopsis: str
    style: str
    inspiration_hint: Optional[str]
    characters: List[CharacterSpec] = field(default_factory=list)
    scenes: List[SceneBeat] = field(default_factory=list)

    def characters_table(self) -> List[dict]:
        return [char.to_row() for char in self.characters]

    def scenes_table(self) -> List[dict]:
        return [scene.to_row() for scene in self.scenes]