<!-- Generated by tools/build_node_reference.py from the node definitions. Do not edit by hand. -->

# Pipeline nodes

DCC bridges, metadata, audio, project handoff, and studio integration.

7 nodes. [All sections](README.md)

- [Audio Cut](#audio-cut)
- [Audio Transcribe](#audio-transcribe)
- [DCC Bridge](#dcc-bridge)
- [Export to Nuke](#export-to-nuke)
- [Export to Resolve](#export-to-resolve)
- [Linear Check](#linear-check)
- [NDI Sender](#ndi-sender)

## Audio Cut

`RadianceAudioCut`

Detect beat, onset, or transient events in audio for video cut points.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `audio_filepath` | string | `/path/to/audio.wav` |  | Absolute path to audio file (WAV, MP3, FLAC, AAC, etc.) |
| `fps` | float | 24 | 1 to 240, step 0.001 | Frame rate of the target video sequence |
| `method` | choice | `beats` | `beats`, `onsets`, `transients` | Honoured by the librosa backend. scipy always finds energy onsets and ffmpeg always finds silence ends; the report says so. |
| `sensitivity` | float | 0.5 | 0 to 1, step 0.01 | 0 = only strong peaks, 1 = detect all micro-variations |
| `min_interval_frames` | int | 12 |  | Minimum frames between consecutive cut points |
| `backend` | choice | `Auto` | `Auto`, `librosa`, `scipy`, `ffmpeg` | Auto: librosa if installed, else scipy, else ffmpeg. scipy finds energy onsets; ffmpeg finds silence ends, its threshold running from -30 dB (sensitivity 1) to -10 dB (sensitivity 0). |
| `frame_offset` (optional) | int | 0 |  | Add this value to every returned frame index (useful when audio starts mid-sequence) |
| `max_cuts` (optional) | int | 0 |  | If > 0, keep N cut points evenly spaced through the detected list (the backends do not return per-cut strength). |

**Outputs**

| Output | Type |
| :--- | :--- |
| `cut_frames_json` | STRING |
| `cut_times_json` | STRING |
| `cut_count` | INT |
| `analysis_report` | STRING |

## Audio Transcribe

`RadianceAudioTranscribe`

Transcribe speech from an audio or video file using Whisper.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `audio_filepath` | string | `/path/to/audio.wav` |  | Absolute path to audio/video file |
| `backend` | choice | `Auto` | `Auto`, `local_whisper`, `openai_api`, `whisper_cli` | Auto: local openai-whisper if installed, else the OpenAI API if a key resolves, else the whisper CLI on PATH. Failures are written to transcribe_report, not raised. |
| `model_size` | choice | `base` | `tiny`, `base`, `small`, `medium`, `large`, `large-v2`, `large-v3` | Whisper model for local_whisper and whisper_cli (larger is slower and more accurate). openai_api always uses whisper-1. |
| `language` | choice | `auto` | `auto`, `en`, `ar`, `zh`, `fr`, `de`, `es`, `ja`, `ko`, `pt`, and 6 more | Spoken language code passed to Whisper. auto lets Whisper detect it. |
| `openai_api_key_env` (optional) | string | `OPENAI_API_KEY` |  | Environment variable name containing the OpenAI API key. |
| `openai_api_key` (optional) | string |  |  | Legacy fallback only. Prefer openai_api_key_env so workflows do not store secrets. |
| `include_timings` (optional) | boolean | on |  | Include per-segment timestamps in segments_json |
| `max_segment_chars` (optional) | int | 0 |  | If > 0, split long segments at this character count |

**Outputs**

| Output | Type |
| :--- | :--- |
| `transcript` | STRING |
| `segments_json` | STRING |
| `segment_count` | INT |
| `transcribe_report` | STRING |

## DCC Bridge

`RadianceMCP`

DCC Bridge — Export frames as EXR/video for DCC consumption, or start a TCP bridge server for command/control between ComfyUI and DCC apps.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `mode` | choice | `Export Frames` | `Export Frames`, `Bridge Server` | Export Frames = save EXR/video for DCC. Bridge Server = start TCP control server. |
| `source` | choice | `Auto` | `Auto`, `Images`, `Video`, `Sequence` | Auto = try Images, then Video, then Sequence. Select explicitly to avoid ambiguity. |
| `target` | choice | `Nuke` | `Nuke`, `Resolve`, `Fusion` | Target DCC application (metadata hint). |
| `output_path` | string |  |  | Output directory for EXR frames (Export mode) or bridge log (Bridge mode). |
| `format` | choice | `EXR (16-bit half)` | `EXR (16-bit half)`, `EXR (32-bit float)`, `EXR + H.264 MP4`, `EXR + ProRes MOV` | EXR bit depth. +H.264 or +ProRes also generates a video file. |
| `images` (optional) | IMAGE |  |  | Batch of frames to export (used when source is Images or Auto). |
| `video_path` (optional) | string |  |  | Path to a video file (.mp4, .mov, etc.) to decode and export (source=Video or Auto). |
| `sequence_path` (optional) | string |  |  | Path/pattern to an image sequence e.g. /frames/frame.%04d.exr (source=Sequence or Auto). |
| `fps` (optional) | float | 24 | 1 to 240, step 0.001 | Frame rate for video export. |
| `frame_start` (optional) | int | 1001 | 0 to 999999 | Starting frame number for EXR sequence export. |
| `frame_end` (optional) | int | 0 | 0 to 999999 | Last frame index (0 = read all found frames, for sequences only). |
| `filename_prefix` (optional) | string | `frame` |  | Prefix for EXR filenames (e.g. frame_1001.exr). |
| `bridge_port` (optional) | int | 1987 | 1024 to 65535 | TCP port for Bridge Server (default 1987). |
| `bridge_host` (optional) | string | `127.0.0.1` |  | Bind address (127.0.0.1 = loopback only; 0.0.0.0 = all interfaces). |

**Outputs**

| Output | Type |
| :--- | :--- |
| `status` | STRING |
| `render_path` | STRING |

## Export to Nuke

`RadianceNukeSend`

Export image as EXR and write a .nk Read-node snippet for direct Nuke import. Optionally load it into a running Nuke through the Radiance listener.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `image` | IMAGE |  |  | Frame to export. A batch is written as a numbered EXR sequence. |
| `nuke_folder` | string |  |  | Output folder for image + .nk file. Created if missing. |
| `filename` | string | `radiance_out` |  | Base name for the EXR file(s). The Read node gets the same name with anything Nuke does not allow in a node name replaced by _. |
| `frame_start` (optional) | int | 1001 | 0 to 999999 | Starting frame number for the EXR sequence. |
| `push_to_nuke` (optional) | boolean | off |  | Also create or update the Read node in a running Nuke. Needs the Radiance listener running there (scripts/start_nuke_server.py). Both sides share a token from ~/.radiance/dcc_token, created automatically, or from RADIANCE_DCC_AUTH_TOKEN; for Nuke on another machine copy that file or set the variable there. |
| `nuke_host` (optional) | string | `127.0.0.1` |  | Nuke listener host (used only when push_to_nuke is on). RADIANCE_NUKE_HOST replaces the default. |
| `nuke_port` (optional) | int | 1986 | 1024 to 65535 | Nuke listener port (used only when push_to_nuke is on). RADIANCE_NUKE_PORT replaces the default. |
| `half_float` (optional) | boolean | on |  | Write 16-bit half EXR (True) or 32-bit float EXR (False). |
| `input_space` (optional) | choice | `As is (no conversion)` | `As is (no conversion)`, `Scene-linear`, `sRGB display` | What the image holds. EXR is written scene-linear: sRGB display input is linearised first. As is: written unchanged, as before. |

**Outputs**

| Output | Type |
| :--- | :--- |
| `status` | STRING |
| `render_path` | STRING |

## Export to Resolve

`RadianceDaVinciSend`

Export the current image to a DaVinci Resolve media folder as 16-bit TIFF, 8-bit PNG or EXR, and optionally import it into the open project's Media Pool.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `image` | IMAGE |  |  | Frame to export. Batches write numbered files. |
| `resolve_folder` | string |  |  | DaVinci Resolve shared media folder. Created if missing. |
| `filename` | string | `radiance_out` |  | Base filename (no extension). |
| `bit_depth` | choice | `16bit` | `16bit`, `8bit`, `EXR` | 16bit: 16-bit TIFF. 8bit: PNG. EXR: 16-bit half-float EXR. |
| `frame_start` (optional) | int | 1001 | 0 to 999999 | Starting frame number for numbered sequences. |
| `input_space` (optional) | choice | `As is (no conversion)` | `As is (no conversion)`, `Scene-linear`, `sRGB display` | What the image holds. TIFF and PNG are written as sRGB display images (scene-linear input is encoded with the sRGB curve, clipped at 1.0); EXR is written scene-linear (sRGB input is linearised). As is: unchanged, as before. |
| `import_to_media_pool` (optional) | boolean | off |  | Also import the files into the open project's Media Pool, through Resolve's scripting API. Needs Resolve running on this machine with Preferences > System > General > External scripting using: Local (Resolve Studio). Each run imports again. |

**Outputs**

| Output | Type |
| :--- | :--- |
| `status` | STRING |
| `render_path` | STRING |

## Linear Check

`RadianceLinearCheck`

Check that the shot metadata tags the image as scene-linear (Linear or ACEScg) before linear-only nodes. It reads the metadata tag only, not the pixel values.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `image` | IMAGE |  |  | Image passed through unchanged. Its pixels are not inspected; only the shot metadata's colorspace tag is checked. |
| `shot_metadata` | RADIANCE_SHOT |  |  | Shot metadata whose 'colorspace' tag is tested. Tags containing 'Linear', or exactly 'ACEScg', pass; anything else (or a missing tag, read as 'Unknown') fails. |
| `action` | choice | `Log Warning` | `Log Warning`, `Strict Error`, `Ignore` | What to do when the tag is not linear: Log Warning writes to the console and continues, Strict Error stops the graph, Ignore does nothing. |

**Outputs**

| Output | Type |
| :--- | :--- |
| `image` | IMAGE |
| `shot_metadata` | RADIANCE_SHOT |

## NDI Sender

`RadianceNDISender`

Stream frames in real time over the NDI network video protocol.

**Inputs**

| Input | Type | Default | Range or choices | What it does |
| :--- | :--- | :--- | :--- | :--- |
| `image` | IMAGE |  |  | Frames to stream, every frame of the batch in order. Sent as 8-bit BGRA, so with encoding None the values must already be display-ready 0-1. |
| `stream_name` | string | `Radiance ComfyUI` |  | NDI source name shown to receivers. Changing it recreates the sender. |
| `encoding` | choice | `None (SDR)` | `None (SDR)`, `S-Log3 (HDR)`, `LogC4 (HDR)` | Curve applied before 8-bit quantisation. None sends values as-is (clipped to 0-1). S-Log3 and LogC4 expect scene-linear input and apply only the log curve (no gamut change), so the receiver must decode with the same curve. |
| `enable_streaming` | boolean | on |  | Enable real-time NDI streaming during generation. Requires NDI SDK installed. |
| `frame_rate` | float | 24 | 1 to 120, step 1 | Frame rate written into NDI video frame metadata. |

**Outputs**

| Output | Type | What it is |
| :--- | :--- | :--- |
| `image` | IMAGE | Pass-through image (unchanged). |
| `connected` | BOOLEAN | True if NDI frame was sent successfully this call. |
