-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
86 lines (75 loc) · 3.16 KB
/
cli.py
File metadata and controls
86 lines (75 loc) · 3.16 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
CLI fuer GameTextbox.
Beispiele:
python cli.py "Hallo Welt"
python cli.py "Das ist ein Test!" --preset pokemon -o output/pokemon.mov
python cli.py "Ein wildes Pikachu erscheint!" --preset pokemon --speed 25
python cli.py "Nanjo..." --preset visual_novel --speaker "Mikshade"
python cli.py "You feel like you're going to have a bad time." --preset undertale
"""
import argparse
import sys
from pathlib import Path
from gametextbox import render
from presets import list_presets
def main():
p = argparse.ArgumentParser(
description="Videospiel-Textbox-Video mit Typewriter-Effekt (transparenter Hintergrund)",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__,
)
p.add_argument("text", help="Text der geschrieben wird (\\n fuer neue Zeile)")
p.add_argument(
"--preset", "-p",
default="classic_rpg",
choices=list_presets(),
help="Textbox-Style (default: classic_rpg)",
)
p.add_argument("--output", "-o", default="output/textbox.mov", help="Ausgabedatei")
p.add_argument("--width", type=int, default=1920, help="Video-Breite (default: 1920)")
p.add_argument("--box-height", type=int, default=360, help="Min. Box-Hoehe (default: 360)")
p.add_argument("--fps", type=int, default=60, help="Frames pro Sekunde (default: 60)")
p.add_argument("--speed", type=float, default=None, help="Zeichen pro Sekunde (ueberschreibt Preset)")
p.add_argument("--font", default=None, help="Pfad zu .ttf/.otf Font")
p.add_argument("--font-size", type=int, default=None, help="Font-Groesse in px")
p.add_argument("--speaker", default="", help="Sprecher-Name (nur Visual Novel Preset)")
p.add_argument(
"--format", "-f",
choices=["prores", "webm"],
default="prores",
help="Video-Format: prores (MOV, DaVinci-ready) oder webm (kleiner)",
)
p.add_argument("--keep-frames", action="store_true", help="PNG-Frames behalten (Debug)")
p.add_argument("--hold", type=int, default=None, help="Frames nach Typewriter (default: Preset)")
p.add_argument("--list-presets", action="store_true", help="Zeigt alle Presets und beendet")
args = p.parse_args()
if args.list_presets:
print("Verfuegbare Presets:")
for name in list_presets():
print(f" - {name}")
sys.exit(0)
# Overrides fuer Preset
overrides = {}
if args.speed is not None:
overrides.setdefault("animation", {})["chars_per_second"] = args.speed
if args.hold is not None:
overrides.setdefault("animation", {})["hold_frames"] = args.hold
if args.font_size is not None:
overrides.setdefault("text", {})["font_size"] = args.font_size
# Text-Argument kann literale \n enthalten die der User als "\\n" uebergibt
text = args.text.replace("\\n", "\n")
render(
text=text,
preset=args.preset,
output=args.output,
width=args.width,
box_height=args.box_height,
fps=args.fps,
font_path=args.font,
speaker_name=args.speaker,
format=args.format,
keep_frames=args.keep_frames,
**overrides,
)
if __name__ == "__main__":
main()