62 lines
2.5 KiB
Python
62 lines
2.5 KiB
Python
"""
|
|
jobs.py — Build and serialise the jobs.json payload passed to process.py.
|
|
|
|
The jobs file is the sole interface between the GUI/host Python environment
|
|
and the Nuke Python environment. Keeping it as plain JSON means process.py
|
|
has no dependency on this project's other modules.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from parser import Shot
|
|
|
|
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
# Public API
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
def build_jobs_payload(shots: list[Shot], template_script: str) -> dict:
|
|
"""Return the dict that will be serialised to jobs.json.
|
|
|
|
Parameters
|
|
----------
|
|
shots:
|
|
Shots selected for rendering.
|
|
template_script:
|
|
Absolute path to the Nuke template (.nk) file.
|
|
"""
|
|
return {
|
|
"template_script": Path(template_script).as_posix(),
|
|
"jobs": [_shot_to_job(s) for s in shots],
|
|
}
|
|
|
|
|
|
def write_jobs_file(payload: dict, path: str) -> None:
|
|
"""Write *payload* to *path* as indented JSON."""
|
|
with open(path, "w", encoding="utf-8") as fh:
|
|
json.dump(payload, fh, indent=2)
|
|
|
|
|
|
def read_jobs_file(path: str) -> dict:
|
|
"""Read and return the jobs payload from *path*."""
|
|
with open(path, encoding="utf-8") as fh:
|
|
return json.load(fh)
|
|
|
|
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
# Internal helpers
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
def _shot_to_job(shot: Shot) -> dict:
|
|
return {
|
|
"basename": shot.basename,
|
|
"input_sequence": shot.input_sequence,
|
|
"first_frame": shot.first_frame,
|
|
"last_frame": shot.last_frame,
|
|
"output_folder": shot.output_folder,
|
|
"output_movie": shot.output_movie,
|
|
"output_exr": shot.output_exr,
|
|
}
|