1+ import os
2+
3+ import inquirer
14import typer
2- from patchwork import app
5+ from pydavinci import davinci
36from rich import print
47from 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
612from patchwork .settings .manager import settings
13+ from pyfiglet import Figlet
14+
15+ resolve = davinci .Resolve ()
716typer_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 )
1183def callback (ctx : typer .Context ):
@@ -29,7 +101,61 @@ def callback(ctx: typer.Context):
29101@typer_app .command ()
30102def 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+ "\n Looks 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+ "\n Are 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