github kajisho5/ffmpeg-skill v1.12.0

latest release: v1.13.0
3 hours ago

Automated release: version and notes generated from pull requests merged since 1.11.1.

Added

  • Fonts by script. caption.py, graphics.py and overlay.py --text detect the writing system of the text they are about to draw (Japanese, Chinese, Korean, Arabic, Hebrew, Devanagari, Thai, Cyrillic, Greek) and resolve a font file that actually covers it — fc-list :lang=xx on Linux/macOS, the known system fonts on Windows — printing one line: font: /usr/share/fonts/.../wqy-zenhei.ttc (covers ko). A machine where fontconfig reports no font for the script fails the job (kind: input, with per-OS install hints) instead of writing a video full of empty boxes that ffmpeg reports as a success; a machine with no working fontconfig at all is unknown, not missing, and the job runs with the font as given behind one info line. An explicit --font, an explicit --font-file, or a font your brand file itself names is always kept (a brand file that never mentions a font is not a choice — the script still picks one); when fontconfig says the stated font does not cover the text, one info line says so. caption.py --fonts-dir is searched first and checked with fc-scan: a directory that does not cover the script gets one line and a font resolved by script anyway.
  • --lang XX on caption.py (an alias of the existing --language, which keeps tagging the subtitle stream under --mode mux and setting --transcribe's language) and on graphics.py, plus "lang" in brand.json: the hint that says whether Han-only text is Chinese, Japanese or Korean. Everything else is read from the characters.
  • doctor's fonts capability gains scripts: available / missing / unknown per writing system with the font file it would use, so "can this machine render Korean captions" is answered before the job. The plain-text doctor summarises it on one line and stays short.
  • Captions people can read. Every cue is wrapped to the safe area by measured width — a per-character table for Latin (read off DejaVu Sans, so a line of capitals measures as wide as it draws), a full em per CJK/Thai character, 0.6 for Arabic/Hebrew, 0.7 for Devanagari, and nothing at all for a combining mark, which never gets separated from the character it belongs to (Thai tone marks and vowel signs, Devanagari matras, Arabic and Hebrew points). Lines break between characters for CJK/Thai and at spaces otherwise. --max-lines N (default 2) splits a cue that needs more lines into consecutive cues sharing its time; --min-duration S (default 1.0) holds a flashed cue longer, never past the next cue's start; --offset TIME shifts every cue for --text, --srt and --ass and takes the skill's timestamp grammar (seconds, mm:ss, hh:mm:ss.ms, SMPTE hh:mm:ss:ff, with a leading - for earlier). One cues: line reports what changed, and a file you passed in is never edited in place — the adjusted copy is written next to the output and burned instead. Under --dry-run/--plan the planned command names that same copy and the plan records where it comes from, while nothing is written until the real run. --min-duration/--offset also work with --write-srt alone; --max-lines needs the input video, whose frame size sets the line width.
  • --karaoke uses real per-word timings when the transcript has them (a whisper <stem>.json / <stem>.words.json next to the SRT), falling back to the existing energy or even split.
  • brand.json styles.caption ({font, size, colour, box, position}, either spelling of colour) — one caption look shared by caption.py and, for font and colour, graphics.py. The older top-level caption block still works and still carries the burn-in-only defaults.
  • render.py projects pass lang, offset, max_lines and min_duration through to the captions stage, and lang to a graphics entry.

Changed

  • doctor's plain fonts: line carries the default font's detail in brackets when the status is not available and the detail is short enough to keep the line to one screen width; longer detail stays --json only.
  • references/gotchas.md on RTL: caption.py shapes and reorders Arabic and Hebrew by construction (everything it draws goes through libass); drawtext (overlay.py --text, graphics.py) does too on a build with --enable-libfribidi/--enable-libharfbuzz, and only an older build draws unjoined logical order.
  • tests/fixtures/mcp_tools.json regenerated: caption gains language (spelled --lang too), offset, max_lines, min_duration; graphics gains lang.

Docs

  • Correction to the 1.11.1 entry: iteration 11's agents did not read references/gotchas.md or references/scripts.md (0 of 36 and 2 of 36 actual reads; the earlier counts matched the file names inside SKILL.md's own text). What 1.11.1 changed in practice, measured in iteration 12: doctor before a job 23 of 36 runs → 0, --json-brief on a writing step 4 of 36 → 23. Tokens per run are flat (72.2k → 71.8k) because about 64k of every run is the harness's own context, not the skill.
  • feat: fonts by script (ja zh ko ar he hi th ru el), doctor per-language fonts, captions that wrap and fit (#218)
  • evals: 14 multilingual prompts (zh ko es pt fr de ar), 7 trigger queries, per-language grader rules (#217)
  • docs: eval iteration 12 at 1.11.1 (36 prompts); correct iteration 11's transcript counts (#216)

What's Changed

  • docs: eval iteration 12 at 1.11.1; correct iteration 11's transcript counts by @kajisho5 in #216
  • evals: multilingual prompts (zh ko es pt fr de ar), trigger queries, per-language grader rules by @kajisho5 in #217
  • feat: fonts by script (ja zh ko ar he hi th ru el), doctor per-language fonts, captions that wrap and fit by @kajisho5 in #218

Full Changelog: v1.11.1...v1.12.0

Don't miss a new ffmpeg-skill release

NewReleases is sending notifications on new releases.