media-analysis
Skill10 starsChanged 20 days agoMITView on GitHub
Measure deterministic facts about a media file (container, streams, video/audio format, silence, loudness, integrity, scene cuts, timing) with local ffprobe/ffmpeg and return a structured Observation. Use when a task needs to *know* something about a video or audio file before deciding anything: duration, resolution, fps, CFR/VFR, codecs, channel layout, where the silence is, how loud it is (LUFS / true peak), whether it decodes cleanly, where hard cuts are. Do not use it to edit, convert, normalise or export media (that is ffmpeg-skill) or to interpret the numbers (that is the agent). Python 3.9 standard library, no cloud, no API keys, no AI.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- PostPlusAI/postplus-skillstheir own version, first seen Nov 5, 2026
- jasonmichaelbell78-creator/sonash-v0their own version, first seen Feb 8, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- PostPlusAI/postplus-skills★ 27same name
- jasonmichaelbell78-creator/sonash-v0★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repositoryOne other file it gives its agents.
- CLAUDE.mdCLAUDE.md
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 109
Treat status: WARN / FAIL (integrity), frame_rate_mode: "variable", entirely_silent: true, integrated_below_absolute_gate: true as facts to …
- Distinctive: line 122
Not here: cutting, normalising, exporting, captions, transcription, thumbnails, speaker detection, semantic scene or slide understanding, …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
media-analysis (Skill)
media-analysis-skill is an observation Skill, not an agent. It measures; it never interprets, decides, plans or edits.
Commands
media-analysis probe <input> [--json]
media-analysis analyze <input> --kind <kind> [--kind <kind> ...] [--param key=value ...] [--json] [--dry-run]
[--asset-id ID] [--analysis-id ID] [--timeout S] [--max-analysis-calls N] [--max-total-seconds S]
[--cache-dir DIR] [--workspace DIR] [--allowed-input ROOT ...] [--round N]
media-analysis run <request.json | -> [--json] [--dry-run] [engine options] # canonical machine interface
media-analysis doctor [--json] [--cache-dir DIR] [--workspace DIR]
media-analysis contract [--json] [--check FILE|-]
media-analysis conformance [--json] # AI-video-production-OS SKILL_SPEC.md section 8 self-checksEngine options: --timeout S, --max-analysis-calls N, --max-total-seconds S, --cache-dir DIR,
--cache-policy use|bypass|only, --workspace DIR, --allowed-input ROOT.
- With
--json, stdout is exactly one response document (media-analysis/response@1) on success and on failure; stderr is diagnostics only. Without--json, stdout is human-readable text and errors go to stderr. - Exit code 0 = every result ok; otherwise the first error's exit code (2..13, table in
contract --json→errors). --dry-runvalidates the request and input path and prints the analyzer, required capabilities and the ffprobe / ffmpeg operations it would run; nothing is executed.
Analysis kinds and parameters
| kind | parameters (defaults) |
media_probe | – |
stream_layout | – |
video_format | stream (0) video stream ordinal |
audio_format | stream (0) audio stream ordinal |
duration | – |
silence | stream (0), threshold_db (-40), min_duration (0.5 s), edge_tolerance (0.1 s) |
loudness | stream (0) |
integrity | max_error_lines (200) |
scene_detection | stream (0), threshold (10, scdet score 0-100), min_scene_duration (0.5 s) |
timing | gap_factor (2.5 × median interval), av_mismatch_tolerance (0.1 s), av_start_offset_tolerance (0.045 s) |
noise_floor | stream (0), channel (-1 = all channels, else one channel), window (0.05 s), noise_percentile (10), signal_percentile (95) |
edit_style | video_stream (0), audio_stream (0), threshold (10, scdet score), min_shot_duration (0.25 s), silence_threshold_db (-50), silence_min_duration (0.5 s), burned_in_interval (1.0 s between sampled frames; 0 = off) |
media-analysis style profile <input> --out profile.json saves an edit_style Observation; media-analysis style diff
<reference.json> <candidate.json> --json prints the metric-by-metric difference (candidate − reference, ADR-030).
media-analysis library index <folder> --index library.json [--tags tags.json] --json indexes a folder of clips
(re-scans measure only new or changed files); media-analysis library search --index library.json --query beach
--orientation portrait --max-duration 10 --json searches it. --tags takes {"<relative path>": ["tag", ...]} from
the caller (this Skill holds no model); ADR-031.
media-analysis highlights talk.mp4 --transcript talk.transcript.json [--signals reactions.json] --keyword launch
--json lists highlight candidates: spans of whole sentences (start / end on sentence boundaries), 15–60 s by default,
with a score and reasons (energy lift, applause / laughter spans the caller passes, keyword density, speaker changes).
It never cuts; ADR-032.
Unknown kinds, unknown parameters, out-of-range values and any command / argv field are rejected with INVALID_INPUT.
AnalysisRequest (structured input)
{"analysis_id": "analysis-001", "asset_id": "asset-001", "input": "sample.mp4", "kind": "silence",
"parameters": {"threshold_db": -45, "min_duration": 1.0}, "timeout": 120, "output_policy": {"round": 3}}media-analysis run accepts one request, a list of requests, or a batch {"requests": [...], "budget": {"max_analysis_calls": 4}}
(budget names other than max_analysis_calls, timeout, max_total_seconds are rejected). analysis_id is
optional: without it the id is derived from the analysis identity (analysis-<16 hex>), so the same file + kind +
parameters always yields the same id. cache_policy: use (read + write, default), bypass (never read or write),
only (read; CACHE_MISS when absent, no analyzer runs).
Response (structured output)
{"schema": "media-analysis/response@1", "skill": {"id": "media-analysis", "version": "<version>"}, "status": "ok", "dry_run": false,
"results": [{"analysis_id": "analysis-001", "asset_id": "asset-001", "kind": "silence", "status": "ok",
"observation": {"id": "obs_…", "asset_id": "asset-001", "kind": "silence",
"data": {"segments": [{"start": 0.0, "end": 2.0, "duration": 2.0, "type": "leading", "runs_to_end": false}], "...": "..."},
"source": "media-analysis/silence@<version>", "analysis_id": "analysis-001", "observed_at": "2026-09-04T10:00:00Z",
"analysis": {"identity": "…", "analyzer": "media-analysis/silence", "analyzer_version": "<version>", "algorithm_version": "1",
"parameters": {"stream": 0, "threshold_db": -45.0, "min_duration": 1.0, "edge_tolerance": 0.1}, "seconds": 0.3},
"asset": {"path": "/abs/sample.mp4", "fingerprint": "<sha256>", "size": 208685}},
"cache": {"status": "miss", "policy": "use", "key": "…"},
"usage": {"analyzer_calls": 1, "seconds": 0.3, "operations": [{"executable": "ffprobe", "purpose": "…"}, {"executable": "ffmpeg", "purpose": "…"}]}}],
"observations": ["…the ok observations in request order…"],
"usage": {"analyzer_calls": 1, "cache_hits": 0, "seconds": 0.3},
"budget": {"calls": 1, "seconds": 0.3, "budget": {"max_analysis_calls": null, "timeout": 600.0, "max_total_seconds": null}},
"warnings": []}A failed result has "status": "error", "error": {"code", "message", "details"} and "error_kind"; the response
status is ok / partial / error. Rules an agent can rely on: source is always media-analysis/<tool>@<version>
(provenance OBSERVED, never AI); data contains only measured values; anything not measurable is null or
"not_performed"; the parameters that produced the measurement are recorded; changing them changes the identity.
Workflow hints for an agent
doctor --jsononce per environment; only use kinds whose analyzer isavailable.media_probefirst (cheap, ffprobe only), then targeted kinds.integrity,loudness,silenceandscene_detectiondecode the whole file.- Pass
--cache-dir(inside your workspace) so repeated questions about the same file are free. - Set
--max-analysis-calls/--max-total-seconds(or a batchbudget) when you have a budget;BUDGET_EXCEEDEDmeans that analyzer did not run and no observation exists for it. - Treat
status: WARN/FAIL(integrity),frame_rate_mode: "variable",entirely_silent: true,integrated_below_absolute_gate: trueas facts to reason about, not as decisions made for you. The Skill never emits a recommendation, a confidence-of-action or an inference; "silence 0–3 s exists" is its whole statement, "trim it" is yours. - Budgets are analyzer wall-clock limits (
max_total_secondsis seconds of analyzer execution, not media duration). - Save
contract --jsononce and re-validate it withcontract --checkafter upgrades;status: driftmeans your cached tool table is stale. conformance --jsonproves (by submitting real requests and scanning real source, not by asserting it) that forbidden keys are rejected, no unsafe shell-out exists, writes stay confined to the workspace, and every published Capability has a valid lifecycle and an AVAILABLE/MISSING doctor status.
Boundaries
Not here: cutting, normalising, exporting, captions, transcription, thumbnails, speaker detection, semantic scene or slide understanding, any AI provider. Not here either: job / resume state, approval, policy, production plans, Project IR, tool selection. Never send this Skill a command, argv, shell string, executable path or credential: the request schema rejects them and nothing in the package can execute them.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

