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())