Skip to content

Commit 2f235cc

Browse files
committed
refactor(cli): Separate CLI funcs from app logic
1 parent e6b2222 commit 2f235cc

1 file changed

Lines changed: 134 additions & 3 deletions

File tree

src/patchwork/cli.py

Lines changed: 134 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,83 @@
1+
import os
2+
3+
import inquirer
14
import typer
2-
from patchwork import app
5+
from pydavinci import davinci
36
from rich import print
47
from rich.panel import Panel
8+
from rich.prompt import Confirm
59

10+
from patchwork.app import MasterFile, track_render
11+
from patchwork.constants import STANDARD_RENDER_PRESETS
612
from patchwork.settings.manager import settings
13+
from pyfiglet import Figlet
14+
15+
resolve = davinci.Resolve()
716
typer_app = typer.Typer()
817

18+
figlet = Figlet(font="rectangles")
19+
print(f"[cyan]{figlet.renderText('patchwork')}")
20+
21+
# CLI HANDLERS AND PROMPTS
22+
23+
24+
def okay_to_write_sidecar(sidecar_output_path: str) -> bool:
25+
26+
if os.path.exists(sidecar_output_path):
27+
if not Confirm.ask(
28+
"Looks like a sidecar file already exists with that name.\n"
29+
"It's linked render file is missing, "
30+
"so it's likely an orphan.\n"
31+
"Overwrite?"
32+
):
33+
return False
34+
return True
35+
36+
37+
def choose_render_preset():
38+
39+
# Remove generic presets?
40+
rp = resolve.project.render_presets
41+
if not settings.render.allow_generic_render_presets:
42+
rp = [x for x in rp if x not in STANDARD_RENDER_PRESETS]
43+
44+
# Prompt for chosen preset
45+
if choice := inquirer.prompt([
46+
inquirer.List(
47+
'render_preset',
48+
message="Choose a render preset",
49+
choices=rp,
50+
)
51+
]):
52+
return choice
53+
exit()
54+
55+
56+
def choose_render_mode():
57+
58+
questions = [
59+
inquirer.List(
60+
'render_mode',
61+
message="Ready to render?",
62+
choices=["Local", "Network Render"],
63+
)
64+
]
65+
answer = inquirer.prompt(questions)
66+
if not answer:
67+
exit()
68+
69+
if answer == "Network Render":
70+
print(
71+
"[cyan]"
72+
"Cool! Select the network render machine, "
73+
"then start the render in Resolve."
74+
)
75+
76+
else:
77+
print("[green]Starting render!")
78+
79+
return answer["render_mode"]
80+
981

1082
@typer_app.callback(invoke_without_command=True)
1183
def callback(ctx: typer.Context):
@@ -29,7 +101,61 @@ def callback(ctx: typer.Context):
29101
@typer_app.command()
30102
def new():
31103
"""Render a new master file of the current timeline"""
32-
app.render_master_file()
104+
105+
print()
106+
107+
# Is resolve busy?
108+
if resolve.project.is_rendering():
109+
if Confirm.ask(
110+
"\nLooks like Resolve is busy rendering!\n"
111+
"You'll have to wait to queue a Patchwork job.\n"
112+
"Check again?"
113+
):
114+
new()
115+
exit()
116+
117+
# Are we happy?
118+
if not Confirm.ask(
119+
"\nAre you happy with the set render range?\n"
120+
"Have you set necessary in and outs?",
121+
):
122+
exit()
123+
124+
# Remove generic presets?
125+
rp = resolve.project.render_presets
126+
if not settings.render.allow_generic_render_presets:
127+
rp = [x for x in rp if x not in STANDARD_RENDER_PRESETS]
128+
129+
# Prompt for chosen preset
130+
choice = inquirer.prompt([
131+
inquirer.List(
132+
'render_preset',
133+
message="Choose a render preset",
134+
choices=rp,
135+
)
136+
])
137+
if not choice:
138+
exit()
139+
140+
render_preset = choice["render_preset"]
141+
142+
# Init masterfile
143+
masterfile = MasterFile(
144+
render_preset=render_preset,
145+
render_directory=settings.app.render_directory,
146+
)
147+
148+
# Write sidecar?
149+
if not okay_to_write_sidecar(masterfile.sidecar_output_path):
150+
exit()
151+
152+
# Write sidecar.
153+
masterfile.write_sidecar(overwrite=True)
154+
155+
# Render
156+
render_mode = choose_render_mode()
157+
job_id = masterfile.start_render(render_mode)
158+
track_render(job_id)
33159

34160

35161
@typer_app.command()
@@ -38,4 +164,9 @@ def patch():
38164
...
39165

40166

41-
typer_app()
167+
def main():
168+
typer_app()
169+
170+
171+
if __name__ == "__main__":
172+
main()

0 commit comments

Comments
 (0)