Action Reference¶
This page catalogues all built-in actions available in K-Pipe pipelines. Actions are referenced by class name in kpipe-publish.toml or kpipe-load.toml.
For how to declare and configure actions in a pipeline, see Pipeline Configuration.
Universal actions¶
These actions have no DCC dependency and can be used in any pipeline.
CollectImageFiles¶
Phase: collect
Scans a list of file paths or directories for image files and stores them as a LayeredSequencePipelineData in the output slot. Directories are scanned non-recursively. Unrecognised file types are skipped with a warning.
Supported extensions: .exr, .png, .jpg, .jpeg, .tif, .tiff, .hdr, .tga, .bmp
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes LayeredSequencePipelineData) |
slot_in_paths |
"main" |
Input slot containing a list[str \| Path] of files or directories |
CollectPBRTextureSet¶
Phase: collect
Classifies images from a LayeredSequencePipelineData slot into a TextureSetPipelineData by inferring PBR map type and colorspace from filenames. Common naming conventions are recognised automatically (e.g. _BaseColor, _roughness, _nrm, _AmbientOcclusion). Typically chained after CollectImageFiles.
If multiple files resolve to the same map type, the first one is kept and a warning is logged. Files with unrecognised names are skipped.
The publish layer name is read from ctx.layer — set by the layer selector in the publish UI — and falls back to the main layer when empty.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes TextureSetPipelineData) |
slot_in_images |
"main" |
Input slot (reads LayeredSequencePipelineData) |
ExtractBurnIn¶
Phase: extract
Composites text burn-ins onto an image sequence using OpenImageIO Python bindings. Reads a SequencePipelineData or LayeredSequencePipelineData from the slot, writes burned-in frames to a sibling temp directory (original directory name + _burnin), and updates the sequence path so downstream integrate actions pick up the new frames automatically.
Requires the openimageio package (import OpenImageIO). Raises PublishError if the bindings are not available.
Text fields accept Python format strings. Available variables:
| Variable | Value |
|---|---|
{project} |
Entity project name |
{entity} |
String representation of the entity |
{task} |
Pipeline task name |
{version} |
Sequence version number (int) |
{frame} |
Current frame number (int) |
{date} |
Today's date as YYYY-MM-DD |
Standard Python format specifiers work: {version:03d}, {frame:04d}, etc.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Input/output slot — accepts SequencePipelineData or LayeredSequencePipelineData |
top_left |
"" |
Text rendered top-left. Empty = skip |
top_center |
"" |
Text rendered top-center |
top_right |
"" |
Text rendered top-right |
bottom_left |
"" |
Text rendered bottom-left |
bottom_center |
"" |
Text rendered bottom-center |
bottom_right |
"" |
Text rendered bottom-right |
font_size |
30 |
Font size in pixels |
font_path |
"" |
Path to a font file. Empty uses the OIIO default font |
color |
(0.8, 0.8, 0.8) |
Text colour as an RGB tuple |
shadow |
2 |
Drop-shadow size in pixels. 0 = no shadow |
padding_x |
30 |
Horizontal padding from the image edge in pixels |
padding_y |
10 |
Vertical padding from the image edge in pixels |
Example:
[[pipeline.render_blender_cycles.extract]]
action = "ExtractBlenderRender"
slot = "main"
[[pipeline.render_blender_cycles.extract]]
action = "ExtractBurnIn"
slot = "main"
top_left = "{project} | {entity} | {task}"
top_right = "{date}"
bottom_left = "v{version:03d}"
bottom_right = "{frame:04d}"
[[pipeline.render_blender_cycles.integrate]]
action = "IntegrateMedia"
slot = "main"
IntegrateMedia¶
Phase: integrate
Moves or copies extracted media from temp render directories into the versioned publish tree and writes product metadata. Handles image sequences, videos, layered sequences, and texture sets.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Input slot — accepts SequencePipelineData, VideoPipelineData, LayeredSequencePipelineData, or TextureSetPipelineData |
remap_frames |
false |
Remap frame numbers from original_frame_range to frame_range (1-based) on copy |
keep_files |
true |
Copy files instead of moving them, leaving the source intact |
source_name |
null |
Optional string recorded in the publish metadata as the source identifier |
CleanMedia¶
Phase: integrate
Deletes the temp render folder(s) left behind by extract actions. Typically placed as the last integrate step. Safe to run even if the folder is already gone.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Slot containing pipeline data whose temp path to delete |
ignore_missing |
true |
If false, raises an error when the temp folder does not exist |
Blender actions¶
CollectBlenderCollection¶
Phase: collect
Collects all objects from a named Blender collection, or the current selection, into a slot as a list of objects.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes list[bpy.types.Object]) |
collection_name |
"" |
Name of the collection to collect. Takes priority over use_selection |
use_selection |
false |
If true and collection_name is empty, collects currently selected objects |
One of collection_name or use_selection must be set; neither raises a ValidationError.
CollectBlenderSingleFrame¶
Phase: collect
Collects a single frame number from the active Blender scene as SequencePipelineData. The output frame_range is always 1–1; original_frame_range holds the actual scene frame number, which IntegrateMedia uses when remap_frames = true.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes SequencePipelineData) |
use_current_frame |
false |
false uses scene.frame_start; true uses scene.frame_current |
CollectBlenderCamera¶
Phase: collect
Collects a camera object from the active Blender scene into a slot for use by ExtractBlenderRender.
| Field | Default | Description |
|---|---|---|
slot |
"camera" |
Output slot (writes bpy.types.Object) |
camera_name |
"" |
Name of a specific camera object. If empty, uses the scene's active camera |
CollectBlenderStoryboardFrames¶
Phase: collect
Collects per-shot frame ranges from VSE storyboard strips into a LayeredSequencePipelineData. Each shot marker becomes one SequencePipelineData entry, with the layer set to {sequence}_{shot}.
Reads use_selected from ctx.settings — if true, only selected strips are processed.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes LayeredSequencePipelineData) |
ExtractBlenderRender¶
Phase: extract
Renders frames from a SequencePipelineData (from slot_in_sequence) to a temp render path, using the camera from slot_in_camera. Saves and restores scene camera, render path, frame range, and file format after rendering.
| Field | Default | Description |
|---|---|---|
slot_in_sequence |
"main" |
Input slot (reads SequencePipelineData) |
slot_in_camera |
"camera" |
Input slot (reads bpy.types.Object camera) |
slot |
"main" |
Output slot (writes updated SequencePipelineData with path/format filled in) |
file_format |
"PNG" |
Blender file format identifier. See table below |
Supported file_format values:
| Value | Extension |
|---|---|
PNG |
.png |
JPEG |
.jpg |
OPEN_EXR |
.exr |
OPEN_EXR_MULTILAYER |
.exr |
TIFF |
.tif |
BMP |
.bmp |
CINEON |
.cin |
DPX |
.dpx |
ExtractBlenderSequencerFrames¶
Phase: extract
Renders frame ranges from the Blender VSE (OpenGL render) to temp render paths. Handles both a single SequencePipelineData and a LayeredSequencePipelineData (renders each layer separately). Saves and restores scene render settings after rendering.
| Field | Default | Description |
|---|---|---|
slot_in_sequence |
"main" |
Input slot (reads SequencePipelineData or LayeredSequencePipelineData) |
slot |
"main" |
Output slot (writes the same data with path/format filled in) |
file_format |
"PNG" |
Blender file format identifier (same values as ExtractBlenderRender) |
shading_type |
"MATERIAL" |
VSE viewport shading. One of WIREFRAME, SOLID, MATERIAL, RENDERED |
Blender load actions¶
Load actions are used in kpipe-load.toml and run as ordered [[pipeline.<key>.load]] steps.
The version and layer to load, and the reference id, are not step fields — they are provided on the pipeline context (ctx.version, ctx.layer, ctx.ref_id) by Session.load_product().
LoadBlenderMedia¶
Loads a published image, image sequence, or video as a Blender image datablock. The datablock is tagged with a kpipe_ref_id custom property linking it back to the reference entry in the sidecar file; if a datablock tagged with the same reference already exists it is reloaded in place rather than duplicated. Datablock names are purely cosmetic ("{entity} {product_type} [{layer}]") — identity always lives in the custom property, so the 63-character name limit and Blender's .001 dedup suffixes are harmless.
| Field | Default | Description |
|---|---|---|
source |
"AUTO" |
AUTO detects from metadata; or set explicitly to SEQUENCE, MOVIE, or FILE |
AUTO detection rules: if frame-end > frame-start in the publish metadata → SEQUENCE; if the file extension is a known video format → MOVIE; otherwise → FILE.
LoadBlenderTextureSet¶
Loads all maps in a published texture set (layer = material name, ctx.layer) as individual Blender image datablocks, applying the colorspace stored in publish metadata. Colorspaces can be overridden per map via colorspace_override. Every created datablock is tagged with kpipe_ref_id (so the full set can be found and removed as a unit) and kpipe_map (the map name, e.g. base_color) custom properties; datablock names are cosmetic ("{entity} {product_type} [{layer}] {map}").
| Field | Default | Description |
|---|---|---|
colorspace_override |
{} |
Dict mapping map name to a Blender colorspace string, overriding stored metadata |
SetupBlenderPBRMaterial¶
Wires texture-set datablocks into a Principled BSDF material node tree. Runs as a second [[load]] step after LoadBlenderTextureSet: it finds all image datablocks tagged with the current ctx.ref_id, identifies each map via the kpipe_map custom property, and connects it to the matching BSDF socket (normal maps get a Normal Map node in between).
The material is named after ctx.layer (the published texture-set layer name). If that is empty, the active material on the selected object is used; when neither yields a name the step is skipped (or raises if skip_no_mat = false).
| Field | Default | Description |
|---|---|---|
normal_strength |
1.0 |
Strength value on the Normal Map node |
skip_no_mat |
true |
Skip silently when no material name can be resolved instead of raising |
Kitsu actions¶
IntegrateKitsuImage¶
Phase: integrate
Uploads a rendered still image as a preview revision on the current Kitsu task. Picks the first image file found in the render directory of the SequencePipelineData slot. Reads note from ctx.settings and attaches it as the revision comment.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Input slot (reads SequencePipelineData) |
task_status |
"" |
Short name of the Kitsu task status to set on upload (e.g. "wfa"). Empty = no change |
set_as_main |
true |
Whether to set the uploaded preview as the entity's main thumbnail |
IntegrateKitsuVideo¶
Phase: integrate
Uploads a rendered video as a preview revision on the current Kitsu task. Reads note from ctx.settings and attaches it as the revision comment.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Input slot (reads VideoPipelineData) |
task_status |
"" |
Short name of the Kitsu task status to set on upload (e.g. "wfa"). Empty = no change |
set_as_main |
true |
Whether to set the uploaded preview as the entity's main thumbnail |
normalize_movie |
true |
Let Kitsu re-encode the video for streaming. Set to false for pre-encoded files |
K-Pipe GUI¶
Actions provided by the kpipe_gui package. They are registered automatically when kpipe_gui is imported.
CollectPublisherPaths¶
Phase: collect
Reads the file paths added in the K-Pipe Publisher tool and writes them to a slot as a list[PurePosixPath]. The publisher injects the dropped paths into ctx.settings["source_files"] before calling run_publish(). Raises PublishError if no files were provided.
Typically the first collect step in a publisher pipeline, feeding its output slot into a downstream action such as CollectImageFiles.
| Field | Default | Description |
|---|---|---|
slot |
"main" |
Output slot (writes list[PurePosixPath]) |
Example: