"""Pydantic models for SEEDREEL configuration, indexes, and plans."""
from datetime import datetime
from pathlib import Path
from typing import Literal
from pydantic import BaseModel, Field
class VideoMetadata(BaseModel):
path: Path
filename: str
duration: float
fps: float
width: int
height: int
codec: str
has_audio: bool
file_size_bytes: int
class VideoIndex(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
source_folder: Path
videos: list[VideoMetadata]
class Plan(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
seed: int
constraints: PlanConstraints
segments: list[ClipSegment]
percussion_track: PercussionTrack = Field(default_factory=PercussionTrack)
class RenderSettings(BaseModel):
codec: str = "libx264"
preset: str = "medium"
crf: int = 18
audio_codec: str = "aac"
audio_bitrate: str = "192k"
pixel_format: str = "yuv420p"
output_fps: int = 30
audio_crossfade_duration: float = 0.05
PRESETS: dict[str, Preset] = {
"calm": Preset(name="calm", description="Slow, meditative pace with longer clips"),
"chaotic": Preset(name="chaotic", description="Fast, energetic cuts with short clips"),
"rapid": Preset(name="rapid", description="Very fast cuts, almost strobing"),
"staccato": Preset(name="staccato", description="Quick punchy cuts with slight variation"),
"pulsed": Preset(name="pulsed", description="Wave-like pacing that builds and releases"),
"balanced": Preset(name="balanced", description="Default balanced settings"),
}
"""Pydantic models for SEEDREEL configuration, indexes, and plans."""
from datetime import datetime
from pathlib import Path
from typing import Literal
from pydantic import BaseModel, Field
class VideoMetadata(BaseModel):
path: Path
filename: str
duration: float
fps: float
width: int
height: int
codec: str
has_audio: bool
file_size_bytes: int
class VideoIndex(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
source_folder: Path
videos: list[VideoMetadata]
class Plan(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
seed: int
constraints: PlanConstraints
segments: list[ClipSegment]
percussion_track: PercussionTrack = Field(default_factory=PercussionTrack)
class RenderSettings(BaseModel):
codec: str = "libx264"
preset: str = "medium"
crf: int = 18
audio_codec: str = "aac"
audio_bitrate: str = "192k"
pixel_format: str = "yuv420p"
output_fps: int = 30
audio_crossfade_duration: float = 0.05
PRESETS: dict[str, Preset] = {
"calm": Preset(name="calm", description="Slow, meditative pace with longer clips"),
"chaotic": Preset(name="chaotic", description="Fast, energetic cuts with short clips"),
"rapid": Preset(name="rapid", description="Very fast cuts, almost strobing"),
"staccato": Preset(name="staccato", description="Quick punchy cuts with slight variation"),
"pulsed": Preset(name="pulsed", description="Wave-like pacing that builds and releases"),
"balanced": Preset(name="balanced", description="Default balanced settings"),
}
"""Pydantic models for SEEDREEL configuration, indexes, and plans."""
from datetime import datetime
from pathlib import Path
from typing import Literal
from pydantic import BaseModel, Field
class VideoMetadata(BaseModel):
path: Path
filename: str
duration: float
fps: float
width: int
height: int
codec: str
has_audio: bool
file_size_bytes: int
class VideoIndex(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
source_folder: Path
videos: list[VideoMetadata]
class Plan(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
seed: int
constraints: PlanConstraints
segments: list[ClipSegment]
percussion_track: PercussionTrack = Field(default_factory=PercussionTrack)
class RenderSettings(BaseModel):
codec: str = "libx264"
preset: str = "medium"
crf: int = 18
audio_codec: str = "aac"
audio_bitrate: str = "192k"
pixel_format: str = "yuv420p"
output_fps: int = 30
audio_crossfade_duration: float = 0.05
PRESETS: dict[str, Preset] = {
"calm": Preset(name="calm", description="Slow, meditative pace with longer clips"),
"chaotic": Preset(name="chaotic", description="Fast, energetic cuts with short clips"),
"rapid": Preset(name="rapid", description="Very fast cuts, almost strobing"),
"staccato": Preset(name="staccato", description="Quick punchy cuts with slight variation"),
"pulsed": Preset(name="pulsed", description="Wave-like pacing that builds and releases"),
"balanced": Preset(name="balanced", description="Default balanced settings"),
}