Initial Commit
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user