162 lines
2.7 KiB
Markdown
162 lines
2.7 KiB
Markdown
Create a Python desktop application using PySide6 called "VFX Pull Processor".
|
|
|
|
Purpose:
|
|
This application scans one or more selected folders recursively for EXR image sequences, then uses Nuke in terminal mode to render proxy movies using a template Nuke script.
|
|
|
|
Architecture:
|
|
|
|
- PySide6 GUI
|
|
- Separate modules
|
|
- app.py
|
|
- gui.py
|
|
- scanner.py
|
|
- parser.py
|
|
- jobs.py
|
|
- nuke_runner.py
|
|
- process.py (runs inside Nuke)
|
|
- config.json
|
|
|
|
The GUI should contain:
|
|
|
|
------------------------------------------------
|
|
VFX Pull Processor
|
|
|
|
Pull Folder
|
|
[_________________________] [Browse]
|
|
|
|
Output Root
|
|
[ V:\_FOOTAGE ] [Browse]
|
|
|
|
Nuke Executable
|
|
[ C:\Program Files\Nuke16.0v1\Nuke16.0.exe ] [Browse]
|
|
|
|
Template Script
|
|
[ proxy_template.nk ] [Browse]
|
|
|
|
------------------------------------------------
|
|
|
|
Sequences Found
|
|
|
|
(QTableWidget)
|
|
|
|
Columns:
|
|
|
|
Checkbox
|
|
Shot
|
|
Frames
|
|
Resolution
|
|
Status
|
|
|
|
------------------------------------------------
|
|
|
|
[ Scan ]
|
|
|
|
[ Render Selected ]
|
|
|
|
Progress Bar
|
|
|
|
Log Window
|
|
|
|
------------------------------------------------
|
|
|
|
Requirements
|
|
|
|
When Scan is pressed:
|
|
|
|
- recursively search every selected folder
|
|
- identify EXR sequences
|
|
- group frames into sequences
|
|
- detect missing frames
|
|
- determine first and last frame
|
|
- populate the table
|
|
|
|
Filename format is always:
|
|
|
|
SHOW_EPISODE_SEQUENCE_SHOT_ELEMENT_TASK_VERSION.FRAME.exr
|
|
|
|
Example:
|
|
|
|
UNG_101_012_010_BG01_TT_v001.01001.exr
|
|
|
|
Parse into:
|
|
|
|
show = UNG
|
|
episode = 101
|
|
sequence = 012
|
|
shot = 010
|
|
element = BG01
|
|
task = TT
|
|
version = v001
|
|
|
|
Create a Shot object containing:
|
|
|
|
show
|
|
episode
|
|
sequence
|
|
shot
|
|
element
|
|
task
|
|
version
|
|
basename
|
|
firstFrame
|
|
lastFrame
|
|
inputSequence
|
|
outputFolder
|
|
outputMovie
|
|
|
|
basename should equal:
|
|
|
|
UNG_101_012_010_BG01_TT_v001
|
|
|
|
Output folder should be:
|
|
|
|
V:/_FOOTAGE/
|
|
{show}/
|
|
{show}_{episode}/
|
|
{basename}/
|
|
|
|
Output files should be:
|
|
|
|
{basename}.exr
|
|
{basename}.mov
|
|
|
|
When Render Selected is pressed:
|
|
|
|
Launch Nuke ONCE using:
|
|
|
|
Nuke.exe -t process.py jobs.json
|
|
|
|
Do NOT launch Nuke once per shot.
|
|
|
|
Instead:
|
|
|
|
- create jobs.json
|
|
- pass it to process.py
|
|
|
|
process.py should:
|
|
|
|
- load proxy_template.nk
|
|
- locate nodes named:
|
|
Read_Input
|
|
Write_Output
|
|
- for each job:
|
|
set Read_Input.file
|
|
set Write_Output.file
|
|
execute render
|
|
- clear caches between jobs if needed
|
|
- print progress to stdout
|
|
|
|
The GUI should capture stdout from Nuke and display it in the log window.
|
|
|
|
Design the code cleanly using dataclasses where appropriate.
|
|
|
|
Keep parsing logic, scanning logic, GUI, and Nuke execution completely separate.
|
|
|
|
The code should be easy to extend later for:
|
|
- JPG proxies
|
|
- PNG proxies
|
|
- Contact sheets
|
|
- Thumbnail generation
|
|
- Validation reports
|
|
|
|
Do not put any pipeline logic inside the Nuke script. The Nuke script is only a visual template. |