File size: 2,354 Bytes
1425afc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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())