| from __future__ import annotations |
|
|
| from dataclasses import dataclass, field |
| from pathlib import Path |
| from typing import Any, Literal |
|
|
| JobState = Literal["PENDING", "RUNNING", "FAILED", "COMPLETED"] |
|
|
|
|
| @dataclass |
| class Scene: |
| start: float |
| duration: float |
| media: str |
| caption: str = "" |
| transition: str = "fade" |
| background: str = "blur" |
|
|
|
|
| @dataclass |
| class RenderRequest: |
| scenes: list[Scene] |
| template: str = "tiktok_classic" |
| output_name: str = "render.mp4" |
| voiceover: str | None = None |
| background_music: str | None = None |
| subtitle_format: Literal["srt", "ass"] = "ass" |
| normalize: bool = True |
| metadata: dict[str, Any] = field(default_factory=dict) |
|
|
|
|
| @dataclass |
| class AIReelsRequest: |
| script: str |
| voiceover: str |
| assets: list[str] |
| template: str = "tiktok_classic" |
| output_name: str = "ai_reel.mp4" |
| background_music: str | None = None |
|
|
|
|
| @dataclass |
| class RenderResult: |
| output_path: Path |
| commands: list[list[str]] |
| metrics: dict[str, Any] |
| logs: list[str] = field(default_factory=list) |
|
|
|
|
| @dataclass |
| class AssetMetadata: |
| path: str |
| mime_type: str |
| size_bytes: int |
| mtime: float |
| duration: float = 0.0 |
| width: int | None = None |
| height: int | None = None |
| fps: float | None = None |
| bitrate: int | None = None |
| video_codec: str | None = None |
| audio_codec: str | None = None |
| has_audio: bool = False |
| streams: list[dict[str, Any]] = field(default_factory=list) |
|
|
|
|
| @dataclass |
| class JobRecord: |
| job_id: str |
| state: JobState |
| created_at: float |
| updated_at: float |
| output_path: str | None = None |
| failure_reason: str | None = None |
| commands: list[list[str]] = field(default_factory=list) |
| logs: list[str] = field(default_factory=list) |
| metrics: dict[str, Any] = field(default_factory=dict) |
|
|