addedInput schema / allOf
Added value: +[
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "set_animation_curve"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "properties": {
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "output_path": {
+ "description": "New output under the source directory; existing paths are refused. Defaults to a numbered _keyframes sibling.",
+ "type": "string"
+ },
+ "points": {
+ "items": {
+ "additionalProperties": false,
+ "oneOf": [
+ {
+ "required": [
+ "time"
+ ]
+ },
+ {
+ "required": [
+ "frame"
+ ]
+ }
+ ],
+ "properties": {
+ "control_in": {
+ "description": "Incoming cubic Bezier control in absolute property units, not an offset. Omit on the first point.",
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "items": {
+ "type": "number"
+ },
+ "maxItems": 2,
+ "minItems": 2,
+ "type": "array"
+ }
+ ]
+ },
+ "control_out": {
+ "description": "Outgoing cubic Bezier control in absolute property units, not an offset. Omit on the last point.",
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "items": {
+ "type": "number"
+ },
+ "maxItems": 2,
+ "minItems": 2,
+ "type": "array"
+ }
+ ]
+ },
+ "easing": {
+ "description": "Outgoing segment parameter: linear u; ease 3u^2-2u^3; easeIn u^2; easeOut 2u-u^2. Omit on last point. Defaults to linear.",
+ "enum": [
+ "linear",
+ "ease",
+ "easeIn",
+ "easeOut"
+ ],
+ "type": "string"
+ },
+ "frame": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "time": {
+ "description": "Rational seconds relative to the visible clip start, e.g. 24/25s.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "items": {
+ "type": "number"
+ },
+ "maxItems": 2,
+ "minItems": 2,
+ "type": "array"
+ }
+ ]
+ }
+ },
+ "required": [
+ "value"
+ ],
+ "type": "object"
+ },
+ "maxItems": 100,
+ "minItems": 2,
+ "type": "array"
+ },
+ "property": {
+ "description": "position uses native FCPXML [x,y] coordinates; scale uses positive multipliers (one number or [x,y]); rotation degrees; opacity 0..1. Volume is not supported; use set_keyframes for audio levels.",
+ "enum": [
+ "position",
+ "scale",
+ "rotation",
+ "opacity"
+ ],
+ "type": "string"
+ },
+ "tolerance": {
+ "description": "Maximum Euclidean vector / absolute scalar error at project frames, in property units. Defaults: position 0.05, scale 0.001, rotation 0.1, opacity 0.001. Smaller values emit more keys; limits 18000 evaluated frames and 1000 output keys. Not a pixel or between-frame bound.",
+ "exclusiveMinimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "filepath",
+ "clip_path",
+ "property",
+ "points"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "set_keyframes"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "position"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "scale"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "rotation"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "opacity"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "not": {
+ "properties": {
+ "interp": {
+ "enum": [
+ "ease",
+ "easeIn",
+ "easeOut"
+ ]
+ }
+ },
+ "required": [
+ "interp",
+ "curve"
+ ]
+ },
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear",
+ "ease",
+ "easeIn",
+ "easeOut"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "volume"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "keyframes": {
+ "items": {
+ "additionalProperties": false,
+ "oneOf": [
+ {
+ "required": [
+ "time"
+ ]
+ },
+ {
+ "required": [
+ "frame"
+ ]
+ }
+ ],
+ "properties": {
+ "curve": {
+ "description": "Compatibility input for native linear normalization; only linear is accepted. Omit to preserve an existing point; new points default to linear. Native spatial smooth/Bezier handles are not exposed by this action.",
+ "enum": [
+ "linear"
+ ],
+ "type": "string"
+ },
+ "frame": {
+ "description": "Clip-relative frame index.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "interp": {
+ "description": "Native temporal interpolation: opacity supports ease/easeIn/easeOut; other properties accept linear only. Serialized without per-frame baking. Omit to preserve an existing point; new points default to linear. Explicit linear normalizes interpolation attributes per property. For nonlinear opacity interp, omit curve; its native encoding removes that attribute.",
+ "enum": [
+ "linear",
+ "ease",
+ "easeIn",
+ "easeOut"
+ ],
+ "type": "string"
+ },
+ "time": {
+ "description": "Rational seconds relative to the visible clip start, e.g. 24/25s.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "items": {
+ "type": "number"
+ },
+ "maxItems": 2,
+ "minItems": 2,
+ "type": "array"
+ }
+ ]
+ }
+ },
+ "required": [
+ "value"
+ ],
+ "type": "object"
+ },
+ "maxItems": 1000,
+ "minItems": 1,
+ "type": "array"
+ },
+ "mode": {
+ "default": "merge",
+ "description": "Merge updates matching times; replace replaces this property's curve.",
+ "enum": [
+ "merge",
+ "replace"
+ ],
+ "type": "string"
+ },
+ "output_path": {
+ "description": "New output under the source directory; existing paths are refused. Defaults to a numbered _keyframes sibling.",
+ "type": "string"
+ },
+ "property": {
+ "description": "position uses native FCPXML [x,y] coordinates; scale uses positive multipliers (one number or [x,y]); rotation degrees; opacity 0..1; volume numeric dB (Final Cut interpolates native gain, not a linear dB ramp).",
+ "enum": [
+ "position",
+ "scale",
+ "rotation",
+ "opacity",
+ "volume"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "filepath",
+ "clip_path",
+ "property",
+ "keyframes"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "delete_keyframes"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "properties": {
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "output_path": {
+ "description": "New output under the source directory; existing paths are refused. Defaults to a numbered _keyframes sibling.",
+ "type": "string"
+ },
+ "property": {
+ "description": "position uses native FCPXML [x,y] coordinates; scale uses positive multipliers (one number or [x,y]); rotation degrees; opacity 0..1; volume numeric dB (Final Cut interpolates native gain, not a linear dB ramp).",
+ "enum": [
+ "position",
+ "scale",
+ "rotation",
+ "opacity",
+ "volume"
+ ],
+ "type": "string"
+ },
+ "times": {
+ "description": "Remove these relative times; omit or null to remove the property's animation.",
+ "items": {
+ "description": "Rational seconds relative to the visible clip start, e.g. 24/25s.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "maxItems": 1000,
+ "minItems": 1,
+ "type": [
+ "array",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "filepath",
+ "clip_path",
+ "property"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "batch_keyframes"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "properties": {
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "operations": {
+ "items": {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "position"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "scale"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "rotation"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "opacity"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "not": {
+ "properties": {
+ "interp": {
+ "enum": [
+ "ease",
+ "easeIn",
+ "easeOut"
+ ]
+ }
+ },
+ "required": [
+ "interp",
+ "curve"
+ ]
+ },
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear",
+ "ease",
+ "easeIn",
+ "easeOut"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "property": {
+ "const": "volume"
+ }
+ },
+ "required": [
+ "property"
+ ]
+ },
+ "then": {
+ "properties": {
+ "keyframes": {
+ "items": {
+ "properties": {
+ "curve": {
+ "enum": [
+ "linear"
+ ]
+ },
+ "interp": {
+ "enum": [
+ "linear"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "action": {
+ "const": "set"
+ },
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "keyframes": {
+ "items": {
+ "additionalProperties": false,
+ "oneOf": [
+ {
+ "required": [
+ "time"
+ ]
+ },
+ {
+ "required": [
+ "frame"
+ ]
+ }
+ ],
+ "properties": {
+ "curve": {
+ "description": "Compatibility input for native linear normalization; only linear is accepted. Omit to preserve an existing point; new points default to linear. Native spatial smooth/Bezier handles are not exposed by this action.",
+ "enum": [
+ "linear"
+ ],
+ "type": "string"
+ },
+ "frame": {
+ "description": "Clip-relative frame index.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "interp": {
+ "description": "Native temporal interpolation: opacity supports ease/easeIn/easeOut; other properties accept linear only. Serialized without per-frame baking. Omit to preserve an existing point; new points default to linear. Explicit linear normalizes interpolation attributes per property. For nonlinear opacity interp, omit curve; its native encoding removes that attribute.",
+ "enum": [
+ "linear",
+ "ease",
+ "easeIn",
+ "easeOut"
+ ],
+ "type": "string"
+ },
+ "time": {
+ "description": "Rational seconds relative to the visible clip start, e.g. 24/25s.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "items": {
+ "type": "number"
+ },
+ "maxItems": 2,
+ "minItems": 2,
+ "type": "array"
+ }
+ ]
+ }
+ },
+ "required": [
+ "value"
+ ],
+ "type": "object"
+ },
+ "maxItems": 1000,
+ "minItems": 1,
+ "type": "array"
+ },
+ "mode": {
+ "default": "merge",
+ "description": "Merge updates matching times; replace replaces this property's curve.",
+ "enum": [
+ "merge",
+ "replace"
+ ],
+ "type": "string"
+ },
+ "property": {
+ "description": "position uses native FCPXML [x,y] coordinates; scale uses positive multipliers (one number or [x,y]); rotation degrees; opacity 0..1; volume numeric dB (Final Cut interpolates native gain, not a linear dB ramp).",
+ "enum": [
+ "position",
+ "scale",
+ "rotation",
+ "opacity",
+ "volume"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "clip_path",
+ "property",
+ "keyframes"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "action": {
+ "const": "delete"
+ },
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "property": {
+ "description": "position uses native FCPXML [x,y] coordinates; scale uses positive multipliers (one number or [x,y]); rotation degrees; opacity 0..1; volume numeric dB (Final Cut interpolates native gain, not a linear dB ramp).",
+ "enum": [
+ "position",
+ "scale",
+ "rotation",
+ "opacity",
+ "volume"
+ ],
+ "type": "string"
+ },
+ "times": {
+ "description": "Remove these relative times; omit or null to remove the property's animation.",
+ "items": {
+ "description": "Rational seconds relative to the visible clip start, e.g. 24/25s.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "maxItems": 1000,
+ "minItems": 1,
+ "type": [
+ "array",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "action",
+ "clip_path",
+ "property"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "maxItems": 100,
+ "minItems": 1,
+ "type": "array"
+ },
+ "output_path": {
+ "description": "New output under the source directory; existing paths are refused. Defaults to a numbered _keyframes sibling.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "filepath",
+ "operations"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "set_speed_curve"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "properties": {
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "frame_sampling": {
+ "default": "floor",
+ "description": "FCP frame sampling mode; optical flow is evaluated by FCP, not this server.",
+ "enum": [
+ "floor",
+ "nearest-neighbor",
+ "frame-blending",
+ "optical-flow-classic",
+ "optical-flow"
+ ],
+ "type": "string"
+ },
+ "output_path": {
+ "description": "New file/bundle under the input directory; never overwrite. Defaults to numbered _retimed sibling.",
+ "type": "string"
+ },
+ "preserve_pitch": {
+ "default": true,
+ "description": "Write FCP native preservesPitch for retimed audio.",
+ "type": "boolean"
+ },
+ "ripple": {
+ "default": true,
+ "description": "Shift following spine clips by the duration change. False requires unchanged duration.",
+ "type": "boolean"
+ },
+ "speed_keyframes": {
+ "description": "Ordered points, starting at zero. Last time is output duration. Integrating speed determines source consumed, which may extend the old trim within the asset.",
+ "items": {
+ "additionalProperties": false,
+ "oneOf": [
+ {
+ "required": [
+ "time"
+ ]
+ },
+ {
+ "required": [
+ "frame"
+ ]
+ }
+ ],
+ "properties": {
+ "frame": {
+ "description": "Output clip-relative project frame index.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "speed": {
+ "description": "Playback multiplier: 0.5 half speed, 2 double speed; forward only.",
+ "exclusiveMinimum": 0,
+ "maximum": 100,
+ "type": "number"
+ },
+ "time": {
+ "description": "Output clip-relative rational time, on a project frame boundary.",
+ "pattern": "^\\d+(?:/[1-9]\\d*)?s$",
+ "type": "string"
+ },
+ "transition": {
+ "default": "linear",
+ "description": "Outgoing segment: hold this speed or linearly ramp to the next. Final point ends the clip.",
+ "enum": [
+ "hold",
+ "linear"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "speed"
+ ],
+ "type": "object"
+ },
+ "maxItems": 1000,
+ "minItems": 2,
+ "type": "array"
+ }
+ },
+ "required": [
+ "filepath",
+ "clip_path",
+ "speed_keyframes"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "action": {
+ "const": "reset_speed"
+ }
+ },
+ "required": [
+ "action"
+ ]
+ },
+ "then": {
+ "properties": {
+ "args": {
+ "additionalProperties": false,
+ "properties": {
+ "clip_path": {
+ "description": "Exact clip_path returned by inspect.list_keyframes; never a clip name.",
+ "type": "string"
+ },
+ "filepath": {
+ "description": "Input FCPXML or .fcpxmld bundle.",
+ "type": "string"
+ },
+ "output_path": {
+ "description": "New file/bundle under the input directory; never overwrite. Defaults to numbered _retimed sibling.",
+ "type": "string"
+ },
+ "ripple": {
+ "default": true,
+ "description": "Shift following spine clips by the duration change. False requires unchanged duration.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "filepath",
+ "clip_path"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "args"
+ ]
+ }
+ }
+]