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.2.0.tar.gz (10.5 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.2.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: clipwright_stabilize-0.2.0.tar.gz
  • Upload date:
  • Size: 10.5 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.2.0.tar.gz
Algorithm Hash digest
SHA256 456d7c3baff1bd96b6957da117afca817a2f66b7be2ae9b257d7115c6063d8cc
MD5 04907a8c8a0ca4d2c55fa17652b2f2ee
BLAKE2b-256 a5a69b66f0d3d7046849279913ee2a0a52668758d7ddb5008f8f1d021adb1702

See more details on using hashes here.

Provenance

The following attestation bundles were made for clipwright_stabilize-0.2.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.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for clipwright_stabilize-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2bf9ffbc3c7512c62a4671181ae659e29bdc323c72c51771de3fa8d4ac83947f
MD5 88b97fa8b3a0b373cb24777cdd97491a
BLAKE2b-256 bd5fde0daf4f7115c681e86ae779010a90eff538ae09d5e746e01351de305e51

See more details on using hashes here.

Provenance

The following attestation bundles were made for clipwright_stabilize-0.2.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