ffmpeg / renderer /templates /caption_templates.py
Ava2lon's picture
Upload 34 files
9845310 verified
Raw
History Blame Contribute Delete
2.35 kB
from __future__ import annotations
from dataclasses import dataclass
@dataclass(frozen=True)
class CaptionTemplate:
key: str
label: str
font_size: int
primary_color: str
secondary_color: str
outline_color: str = "&H000000"
back_color: str = "&H80000000"
alignment: int = 2
margin_v: int = 180
bold: bool = True
effect: str = "none"
def ass_style(self) -> str:
bold = -1 if self.bold else 0
return (
"Style: Default,DejaVu Sans,"
f"{self.font_size},{self.primary_color},{self.secondary_color},"
f"{self.outline_color},{self.back_color},{bold},0,0,0,100,100,0,0,3,3,1,"
f"{self.alignment},80,80,{self.margin_v},1"
)
TEMPLATES: dict[str, CaptionTemplate] = {
"tiktok_classic": CaptionTemplate("tiktok_classic", "TikTok Classic", 64, "&H00FFFFFF", "&H0000FFFF", effect="karaoke"),
"tiktok_zoom": CaptionTemplate("tiktok_zoom", "TikTok Zoom", 72, "&H00FFFFFF", "&H0000E5FF", effect="zoom"),
"alex_hormozi": CaptionTemplate("alex_hormozi", "Alex Hormozi", 70, "&H0000FFFF", "&H00FFFFFF", effect="bounce"),
"modern_minimal": CaptionTemplate("modern_minimal", "Modern Minimal", 52, "&H00FFFFFF", "&H00DDDDDD", margin_v=240),
"youtube_shorts": CaptionTemplate("youtube_shorts", "YouTube Shorts", 62, "&H00FFFFFF", "&H000000FF", effect="karaoke"),
"podcast_style": CaptionTemplate("podcast_style", "Podcast Style", 48, "&H00F5F5F5", "&H0099CCFF", margin_v=120),
"news_style": CaptionTemplate("news_style", "News Style", 46, "&H00FFFFFF", "&H0000FFFF", alignment=2, margin_v=100),
"neon_pop": CaptionTemplate("neon_pop", "Neon Pop", 76, "&H00FFFFFF", "&H0000E5FF", outline_color="&H00FF2BD6", effect="karaoke"),
"product_demo": CaptionTemplate("product_demo", "Product Demo", 54, "&H00FFFFFF", "&H00C7F9CC", margin_v=210, effect="zoom"),
"cinematic_gold": CaptionTemplate("cinematic_gold", "Cinematic Gold", 50, "&H00F4E7B2", "&H00FFFFFF", outline_color="&H00111111", margin_v=180),
"creator_clean": CaptionTemplate("creator_clean", "Creator Clean", 58, "&H00FFFFFF", "&H00BCE7FD", margin_v=220, effect="bounce"),
}
def get_template(key: str) -> CaptionTemplate:
return TEMPLATES.get(key, TEMPLATES["tiktok_classic"])
def list_templates() -> list[str]:
return list(TEMPLATES.keys())