Skip to main content

clipwright-stabilize

MCP tool for video shake detection and OTIO timeline stabilize annotation generation.

Overview

Runs ffmpeg vidstabdetect to generate a .trf transform file, estimates shake severity from the binary TRF1 data (best-effort heuristic), and writes a stabilize directive to timeline-level metadata["clipwright"]["stabilize"].

Performs detection only (OTIO annotation); realization (vidstabtransform application) is done once by clipwright-render (design M3: separation of detection and application).

Severity estimation:

  • Reads the binary TRF1 file produced by vidstabdetect.
  • Scans all IEEE-754 little-endian doubles, computes mean absolute value.
  • Normalises by a pinned heuristic constant (_NORM_PX = 30.0 px) to derive a severity in [0.0, 1.0].
  • Returns severity=null when the file cannot be parsed (non-fatal; render does not use severity).

Prerequisites

  • Python 3.11 or later
  • ffmpeg compiled with --enable-libvidstab must exist on PATH or full path set in environment variable CLIPWRIGHT_FFMPEG. Standard distribution builds (apt, brew, choco) may NOT include libvidstab. Use a build that explicitly enables the vidstab filter.
export CLIPWRIGHT_FFMPEG=/path/to/ffmpeg-with-libvidstab
export CLIPWRIGHT_FFPROBE=/path/to/ffprobe

MCP Tool

clipwright_detect_shake

Parameters

Name Type Default Description
media string required Input video file path (video stream required)
output string required Output OTIO timeline path (.otio, same directory as media)
options.shakiness int 5 vidstabdetect shakiness 1-10 (higher = assume more shake)
options.accuracy int 15 vidstabdetect accuracy 1-15 (higher = more accurate / slower)
options.smoothing int 30 vidstabtransform smoothing window in frames 0-1000
timeline string | null null Existing OTIO timeline path (if specified, append stabilize directive)

Return value

The tool returns a ToolResult envelope:

{
  "ok": true,
  "summary": "Shake analysis of video.mp4 complete. severity=0.312, shakiness=5, smoothing=30. Stabilize directive and video.stabilize.trf written; apply with clipwright-render.",
  "data": {
    "severity": 0.312,
    "shakiness": 5,
    "accuracy": 15,
    "smoothing": 30,
    "trf_basename": "video.stabilize.trf"
  },
  "artifacts": [
    {"role": "timeline", "path": "out.otio", "format": "otio"},
    {"role": "analysis", "path": "video.stabilize.trf", "format": "trf"}
  ],
  "warnings": []
}

When libvidstab is not compiled into the ffmpeg build, the tool returns UNSUPPORTED_OPERATION with installation guidance (no path or raw stderr exposed).

Dependencies

Package Purpose
clipwright Shared types, envelope, errors, process.run
mcp[cli] MCP server
pydantic Parameter validation

ffmpeg is invoked as a separate process (via PATH or environment variable) for license independence.

Detection and Render Two-Phase Flow

  1. detect (this tool): ffmpeg -i <media> -vf "vidstabdetect=result=<stem>.stabilize.trf:shakiness=<n>:accuracy=<n>" -f null - generates .trf and saves the stabilize directive to OTIO annotation.
  2. render (clipwright-render): reads metadata["clipwright"]["stabilize"] and applies vidstabtransform=input=<basename>:smoothing=<n> in the ffmpeg filter graph using cwd=<trf parent directory> for Windows-safe relative path resolution.

Installation and Startup

Within a uv workspace:

uv run --package clipwright-stabilize clipwright-stabilize

Or install directly:

uv add clipwright-stabilize
clipwright-stabilize

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clipwright_stabilize-0.4.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clipwright_stabilize-0.4.0-py3-none-any.whl (16.9 kB view details)

Uploaded Python 3

File details

Details for the file clipwright_stabilize-0.4.0.tar.gz.

File metadata

  • Download URL: clipwright_stabilize-0.4.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for clipwright_stabilize-0.4.0.tar.gz
Algorithm Hash digest
SHA256 8c42baf672996b2e62003ad4edf0b1ddf83252a470dbd96b370e9c70123e2df4
MD5 35f4763d94a037502e25129016b2c1de
BLAKE2b-256 3c16c4d9f5dca2a58425c540d1ad98404dc17a27ce68e675569a34247df8d689

See more details on using hashes here.

Provenance

The following attestation bundles were made for clipwright_stabilize-0.4.0.tar.gz:

Publisher: publish.yml on satoh-y-0323/clipwright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file clipwright_stabilize-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for clipwright_stabilize-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 97b0e83ee4818f4b7ec2263cbb55e2776413e8668a0c430c194e50b979807c5f
MD5 c74aa97c5ae9ac1d870e00860c3b8973
BLAKE2b-256 af8c9220dd2a33d53c747deda09b042e7b6ec1fe4a297f1da59b69f2662a9029

See more details on using hashes here.

Provenance

The following attestation bundles were made for clipwright_stabilize-0.4.0-py3-none-any.whl:

Publisher: publish.yml on satoh-y-0323/clipwright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page