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