ffmpeg-skill 2.13.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -420,7 +420,7 @@ The encode path a tool will actually take is Apple VideoToolbox, for h264, hevc
420
420
 
421
421
  ## FFmpeg compatibility
422
422
 
423
- The tools need FFmpeg 5.0 or later and Python 3.9 or later (standard library only); Python 3.10+ is recommended: 3.9 still works but is deprecated since 2.10.9 (CPython 3.9 is end of life), `doctor` and the `npx` installer warn on it, and 3.0 drops it. What CI actually exercises on every pull request is FFmpeg 5.1.1 (static build), 6.1 (Ubuntu apt), 7.1 (Debian trixie apt), 8.x (macOS Homebrew) and 9.x (Windows gyan.dev), on Python 3.9 and 3.13 (the two ends of the supported range). The capability parser has been run against the listings of these builds:
423
+ The tools need FFmpeg 5.0 or later and Python 3.9 or later (standard library only). FFmpeg 6.1+ is recommended: FFmpeg 5.x still works but is deprecated since 2.14.0, `doctor` and the `npx` installer warn on it, and 3.0 requires 6.1. Python 3.10+ is recommended too: 3.9 still works but is deprecated since 2.10.9 (CPython 3.9 is end of life), `doctor` and the `npx` installer warn on it, and 3.0 drops it. What CI actually exercises on every pull request is FFmpeg 5.1.1 (static build), 6.1 (Ubuntu apt), 7.1 (Debian trixie apt), 8.x (macOS Homebrew) and 9.x (Windows gyan.dev), on Python 3.9 and 3.13 (the two ends of the supported range). The capability parser has been run against the listings of these builds:
424
424
 
425
425
  | FFmpeg | `-filters` row layout | Source |
426
426
  |---|---|---|
@@ -527,7 +527,7 @@ FFmpeg itself:
527
527
 
528
528
  ## Requirements
529
529
 
530
- - FFmpeg 5.0+. Always required: `libx264`, `aac`, and the `drawtext`, `subtitles` (libass), `loudnorm`, `xfade`, `acrossfade`, `scdet`, `silencedetect` and `tile` filters. Needed only by the flags that use them: `libx265`, `prores_ks`, `libzimg` / `zscale`, `libmp3lame`, `libopus`, `libvorbis`, the `ass` filter. `doctor` tells you which are present. The apt and gyan.dev builds carry all of them; some Homebrew bottles lack `libass` / `libfreetype` / `libzimg`, which `doctor` reports as missing.
530
+ - FFmpeg 5.0+ (FFmpeg 5.x is deprecated since 2.14.0 and 3.0 requires 6.1; 6.1+ recommended). Always required: `libx264`, `aac`, and the `drawtext`, `subtitles` (libass), `loudnorm`, `xfade`, `acrossfade`, `scdet`, `silencedetect` and `tile` filters. Needed only by the flags that use them: `libx265`, `prores_ks`, `libzimg` / `zscale`, `libmp3lame`, `libopus`, `libvorbis`, the `ass` filter. `doctor` tells you which are present. The apt and gyan.dev builds carry all of them; some Homebrew bottles lack `libass` / `libfreetype` / `libzimg`, which `doctor` reports as missing.
531
531
  - Python 3.10+ recommended, standard library only. 3.9 still works but is deprecated (end of life upstream; support ends in 3.0)
532
532
  - Node 16+ only for the `npx` installer
533
533
 
package/bin/install.js CHANGED
@@ -55,6 +55,16 @@ function pythonDeprecation(version) {
55
55
  return version === '3.9' ? PY39_DEPRECATION : null;
56
56
  }
57
57
 
58
+ // 2.14.0 deprecates FFmpeg 5.x the same way. The same line as scripts/_contract.py's
59
+ // FFMPEG5_DEPRECATION (a test keeps them equal).
60
+ const FFMPEG5_DEPRECATION = 'warning: FFmpeg 5.x is deprecated since ffmpeg-skill 2.14.0 (the 5.x branches date from 2022; Ubuntu 24.04 ships 6.1); it still works in 2.x and support ends in 3.0.0: use FFmpeg 6.1+.';
61
+
62
+ // The line for `ffmpeg -version`'s first line, or null (not 5.x, or not a release number).
63
+ function ffmpegDeprecation(versionLine) {
64
+ const m = /^ffmpeg version n?(\d+)\.\d+/.exec(versionLine || '');
65
+ return m && m[1] === '5' ? FFMPEG5_DEPRECATION : null;
66
+ }
67
+
58
68
  function pythonCandidates(platform) {
59
69
  return platform === 'win32' ? ['python3', 'python', 'py'] : ['python3'];
60
70
  }
@@ -146,7 +156,10 @@ function checkFfmpeg() {
146
156
  console.warn(' Windows: winget install Gyan.FFmpeg\n');
147
157
  return false;
148
158
  }
149
- console.log(` found ${r.stdout.split('\n')[0]}`);
159
+ const first = r.stdout.split('\n')[0];
160
+ console.log(` found ${first}`);
161
+ const line = ffmpegDeprecation(first);
162
+ if (line) console.warn(`\n ${line}`);
150
163
  return true;
151
164
  }
152
165
 
@@ -211,4 +224,4 @@ if (require.main === module) {
211
224
  main();
212
225
  }
213
226
 
214
- module.exports = { pythonCandidates, runWithPython, findPython, pythonDeprecation, warnDeprecatedPython, PY39_DEPRECATION };
227
+ module.exports = { pythonCandidates, runWithPython, findPython, pythonDeprecation, warnDeprecatedPython, PY39_DEPRECATION, ffmpegDeprecation, FFMPEG5_DEPRECATION };
package/docs/contract.md CHANGED
@@ -21,7 +21,7 @@ The contract is derived from the code that runs, not maintained beside it:
21
21
  | Field | Meaning | Changes when |
22
22
  |---|---|---|
23
23
  | `contract_version` | shape of this document (`1.0`) | a key is renamed, removed or changes meaning |
24
- | `skill.version` | the npm / package.json version (`2.13.0`) | any release |
24
+ | `skill.version` | the npm / package.json version (`2.14.0`) | any release |
25
25
 
26
26
  A release that adds a tool or a flag keeps `contract_version`; a breaking change to the
27
27
  ToolSpec shape bumps it. Consumers pin on `contract_version` and read `skill.version`
@@ -88,6 +88,11 @@ in October 2025 and gets no security fixes, but raising the floor is a break, so
88
88
  recommended: on 3.9, `doctor` and the `npx` installer print one stderr line,
89
89
  `warning: Python 3.9 is deprecated since ffmpeg-skill 2.10.9 (...); it still works in 2.x and support ends in 3.0.0: use Python 3.10+.`
90
90
  Like every deprecation warning it is stderr only: `doctor --json`'s document has no key for it.
91
+ Since 2.14.0 there is a second entry, **running on FFmpeg 5.x** (`where: behaviour`, `removed_in: 3.0.0`),
92
+ handled the same way: `requirements.ffmpeg` stays `>=5.0` and CI keeps its 5.1.1 job until 3.0, which
93
+ requires 6.1. When `ffmpeg -version` reads 5.x, `doctor` and the `npx` installer print one stderr line,
94
+ `warning: FFmpeg 5.x is deprecated since ffmpeg-skill 2.14.0 (...); it still works in 2.x and support ends in 3.0.0: use FFmpeg 6.1+.`
95
+ A version that is not a release number (a git snapshot) gets no line.
91
96
  `tests/test_contract.py` refuses a package.json major bump that still lists an entry that major should remove, or that
92
97
  comes before step 2's window has passed -- unless the waiver is written here, as 2.0.0's is.
93
98
 
@@ -123,12 +128,13 @@ JSON would have been rewritten for that. The flat keys, typed per tool in `outpu
123
128
  ```json
124
129
  {
125
130
  "contract_version": "1.0",
126
- "deprecated": [{"what": "running on Python 3.9 (the requirements.python floor)", "since": "2.10.9", "replacement": "Python 3.10 or later; ...", "removed_in": "3.0.0", "where": "behaviour"}],
131
+ "deprecated": [{"what": "running on Python 3.9 (the requirements.python floor)", "since": "2.10.9", "replacement": "Python 3.10 or later; ...", "removed_in": "3.0.0", "where": "behaviour"},
132
+ {"what": "running on FFmpeg 5.x (the requirements.ffmpeg floor)", "since": "2.14.0", "replacement": "FFmpeg 6.1 or later; ...", "removed_in": "3.0.0", "where": "behaviour"}],
127
133
  "removed": [{"what": "...", "since": "1.10.0", "replacement": "...", "removed_in": "2.0.0", "where": "cli | json | mcp | behaviour"}],
128
- "skill": {"id": "ffmpeg-skill", "version": "2.13.0", "execution_mode": "local", "kind": "execution",
134
+ "skill": {"id": "ffmpeg-skill", "version": "2.14.0", "execution_mode": "local", "kind": "execution",
129
135
  "entrypoints": {"cli": "...", "mcp": "...", "contract": "...", "doctor": "..."},
130
136
  "not_provided": ["AI reasoning", "decisions", "production plans", "project IR", "approvals", "network access", "transcription engine"]},
131
- "requirements": {"python": ">=3.9 (standard library only; 3.9 deprecated since 2.10.9, removed in 3.0.0; 3.10+ recommended)", "ffmpeg": ">=5.0", "ffprobe": ">=5.0"},
137
+ "requirements": {"python": ">=3.9 (standard library only; 3.9 deprecated since 2.10.9, removed in 3.0.0; 3.10+ recommended)", "ffmpeg": ">=5.0 (5.x deprecated since 2.14.0, removed in 3.0.0; 6.1+ recommended)", "ffprobe": ">=5.0"},
132
138
  "execution": {"shell": false, "arbitrary_executables": false, "network": false,
133
139
  "model_downloads": {"when": "...", "in_process": {"faster-whisper": "..."},
134
140
  "child_process": {"parakeet-mlx": "...", "openai-whisper": "..."},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ffmpeg-skill",
3
- "version": "2.13.0",
3
+ "version": "2.14.0",
4
4
  "description": "Agent Skill that gives coding agents (Claude Code, Cursor, Codex) a local video editor: 42 FFmpeg tools with a machine-readable contract, contract-derived MCP server, FFmpeg capability detection, probe-first / verify-last workflow. Cut, join, silence removal, fit, captions and karaoke, overlays, motion graphics, HDR to SDR, LUTs, audio clean-up and typed dynamics, sync with drift correction, multicam, loudness, delivery checks, project rendering, batch. No API keys, no cloud, no dependencies.",
5
5
  "keywords": [
6
6
  "ffmpeg",
@@ -987,6 +987,20 @@ def python_deprecation(version_info: Optional[tuple] = None) -> Optional[str]:
987
987
  return PY39_DEPRECATION if vi == (3, 9) else None
988
988
 
989
989
 
990
+ # 2.14.0 deprecates FFmpeg 5.x the same way (DEPRECATED below): 2.x keeps running on it and CI keeps
991
+ # its 5.1.1 job, and the line names 3.0.0 as the release that raises the floor to 6.1. bin/install.js
992
+ # prints it too (FFMPEG5_DEPRECATION there; a test keeps the two equal).
993
+ FFMPEG5_DEPRECATION = ("warning: FFmpeg 5.x is deprecated since ffmpeg-skill 2.14.0 (the 5.x branches date from 2022; "
994
+ "Ubuntu 24.04 ships 6.1); it still works in 2.x and support ends in 3.0.0: use FFmpeg 6.1+.")
995
+
996
+
997
+ def ffmpeg_deprecation(version: Optional[str]) -> Optional[str]:
998
+ """The deprecation line for this ffmpeg's version token, or None (not 5.x, or not a release
999
+ number: a git snapshot gets no line, as with the security advisory)."""
1000
+ v = _parse_ffmpeg_version(version)
1001
+ return FFMPEG5_DEPRECATION if v and v[0] == 5 else None
1002
+
1003
+
990
1004
  def _exe_report() -> Dict[str, Any]:
991
1005
  """`ffmpeg_path` / `ffmpeg_source` / `ffprobe_path` / `ffprobe_source`: which binary the tools run
992
1006
  and why ("path": what PATH resolves; "homebrew-ffmpeg-full": macOS, a lean Homebrew ffmpeg on
@@ -1549,6 +1563,12 @@ DEPRECATED: List[Dict[str, str]] = [
1549
1563
  {"what": "running on Python 3.9 (the requirements.python floor)",
1550
1564
  "since": "2.10.9", "removed_in": "3.0.0", "where": "behaviour",
1551
1565
  "replacement": "Python 3.10 or later; on 3.9, doctor and the npx installer print a one-line warning"},
1566
+ # FFmpeg 5.x: the 5.x branches date from 2022 and keep version-specific workarounds alive.
1567
+ # 2.x keeps running on 5.0+ (CI still tests 5.1.1) and doctor / bin/install.js print
1568
+ # FFMPEG5_DEPRECATION; 3.0.0 raises requirements.ffmpeg to 6.1.
1569
+ {"what": "running on FFmpeg 5.x (the requirements.ffmpeg floor)",
1570
+ "since": "2.14.0", "removed_in": "3.0.0", "where": "behaviour",
1571
+ "replacement": "FFmpeg 6.1 or later; on 5.x, doctor and the npx installer print a one-line warning"},
1552
1572
  ]
1553
1573
 
1554
1574
  # What 2.0.0 removed or changed, with the version that deprecated each: the "Removed" half of the
@@ -1787,7 +1807,7 @@ def build(detect: bool = True) -> Dict[str, Any]:
1787
1807
  },
1788
1808
  "not_provided": ["AI reasoning", "decisions", "production plans", "project IR", "approvals", "network access", "transcription engine"],
1789
1809
  },
1790
- "requirements": {"python": ">=3.9 (standard library only; 3.9 deprecated since 2.10.9, removed in 3.0.0; 3.10+ recommended)", "ffmpeg": ">=5.0", "ffprobe": ">=5.0", "node": ">=16 (npx installer only)"},
1810
+ "requirements": {"python": ">=3.9 (standard library only; 3.9 deprecated since 2.10.9, removed in 3.0.0; 3.10+ recommended)", "ffmpeg": ">=5.0 (5.x deprecated since 2.14.0, removed in 3.0.0; 6.1+ recommended)", "ffprobe": ">=5.0", "node": ">=16 (npx installer only)"},
1791
1811
  "execution": {
1792
1812
  "shell": False,
1793
1813
  "arbitrary_executables": False,
@@ -1872,8 +1892,9 @@ def main() -> int:
1872
1892
  # Advisories, never failures: on stderr in both modes, so `doctor --json`'s stdout stays one
1873
1893
  # JSON document. The FFmpeg ones are also in the document (`ffmpeg_security.warnings`); the
1874
1894
  # Python 3.9 deprecation is stderr-only, as every deprecation warning is (docs/contract.md
1875
- # "Deprecation policy" step 1), and machine-readable in `contract --json`'s `deprecated`.
1876
- for line in [python_deprecation()] + d["ffmpeg_security"]["warnings"]:
1895
+ # "Deprecation policy" step 1), and machine-readable in `contract --json`'s `deprecated`;
1896
+ # so is the FFmpeg 5.x one.
1897
+ for line in [python_deprecation(), ffmpeg_deprecation(d.get("ffmpeg"))] + d["ffmpeg_security"]["warnings"]:
1877
1898
  if line:
1878
1899
  print(line, file=sys.stderr)
1879
1900
  if args.json: