github kajisho5/ffmpeg-skill v1.14.0

4 hours ago

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

Added

  • One delivery table (scripts/_platforms.py, internal — the public tool count is unchanged at 42). Every destination is described once: frame, fps, the compliance spec check.py reports (duration, aspects, minimum height, fps, codecs, size, LUFS, true peak, SDR-only), the fraction of the frame the app's own UI covers, caption defaults, the export preset and the check platform. check.py's SPECS and export.py's PRESETS/PLATFORM_OF are now built from it — each platform preset's frame and duration cap included — so the loudness export.py --normalize hits, the frame it writes, the cap it trims at and the spec check.py enforces are the same numbers by construction (two presets deliberately differ and say so in the code: youtube4k is YouTube at 2160p, and no youtube* preset trims at YouTube's 12-hour limit). The alias map (youtube-shorts/yt-shortsshorts, ytyoutube, instagram/igreels, twitterx, fbfacebook) is accepted by check.py --platform, export.py --preset, caption.py/graphics.py/overlay.py --platform, look.py --safe and render.py --template alike, and those tools now offer one platform vocabulary rather than three. Existing platform rows and preset command lines are byte-for-byte what they were.
  • Delivery templates: render.py --template tiktok INPUT [--cues cues.txt | --srt subs.srt] [--logo] [--title] [--brand] [--chapters] [--fit crop|pad|blur] [-o OUT] fills a project shipped in templates/ and renders it — frame and fit, captions sized and placed clear of the platform's UI, loudness, the platform export preset and that platform's check.py in one command. Templates ship for tiktok, reels, shorts, youtube-shorts, youtube, x, linkedin, facebook and podcast (audio: silence trim, −16 LUFS, chapters when given, the podcast check). --list-templates prints them with their frames, limits and safe zones; --write-project FILE writes the filled project for editing and renders nothing; an unknown name is refused (kind: input) with the list.
  • The social pack: render.py --template all INPUT (or --template tiktok,reels,x) renders every named destination from the same edit into <stem>_<platform>.mp4 next to the input (.m4a for an audio-only destination, and --chapters reaches it), runs each platform's own check, and writes <stem>_pack.md with one table row per destination (file, size, duration, check). Under --dry-run the pack prints every child's planned commands and its table reads planned with no size or duration, since nothing was encoded and nothing was verified. report.py --pack <stem>_pack.md renders that table as an HTML page.
  • Real presets per destination: export.py --preset tiktok|shorts|linkedin|facebook are their own entries rather than aliases of reels/youtube, each with its platform's frame, duration limit and loudness spec. --preset youtube-hdr writes HEVC Main10 keeping the source's own HDR10/HLG tags and refuses an SDR source (kind: input, pointing at --preset youtube) instead of labelling SDR as HDR; --preset youtube-av1 encodes AV1 with SVT-AV1 (libaom fallback) and refuses with kind: missing_tool on a build that has neither. check.py --platform facebook is new.
  • Text stays out of the app's UI: caption.py --platform NAME, graphics.py --platform NAME and overlay.py --platform NAME (so a template's --logo clears TikTok's status bar instead of landing 24 px under it) take their margins from that destination's safe zone (TikTok covers the bottom 22 % with its description block and the right 14 % with the like column; Reels 20 %/12 %, Shorts 18 %/12 %; the feed destinations keep a 5 % title-safe border). An explicit --margin (new on graphics.py) or --position wins. render.py passes --platform only for projects filled from a template, so a hand-written project is unchanged. look.py --safe NAME shades those zones on the sheet or frame, so "is the caption readable" can be checked against the app and not just the file.
  • fit.py --fit blur: reach an aspect with the whole picture centred on a blurred, darkened (eq brightness=-0.15) copy of itself — nothing cropped, no black bars. The darkening is SDR-only: an eq on PQ/HLG code values is not the same perceptual dim, so an HDR source keeps an undimmed (and un-tone-mapped) blurred background, with one info line saying so. Templates ask for it as "frame": {"aspect": "9:16", "fit": "blur"}, or render.py --template tiktok clip.mp4 --fit blur. render.py projects now accept "frame": {"fit": ...}.
  • graphics.py --template sticker|hook|meme: a filled chip of --text that pops in at --position (the social sticker), the full-width opening card (--title --duration 3) with a thin progress bar along the top that empties as the card's time runs out, and the classic meme layout (--top/--bottom, upper-case white with a heavy black outline). All three work inside a render.py project's graphics[] — which now takes text, top, bottom, duration, margin and platform alongside the older keys — and honour --platform's safe zone.
  • render.py projects may carry "template" (the template they were filled from) and audio-only deliveries now carry their intermediates through the audio container instead of .mp4, which is what makes the podcast template render end to end from a .wav.

Docs

  • SKILL.md gains the delivery-template rows and the safe-zone gotcha, references/scripts.md a templates section with the safe-zone table, docs/contract.md the delivery-table shape, what is derived from it and the new arguments, references/gotchas.md a "Platform safe zones" section (the target of SKILL.md's safe-zone pointer), and the README a "Deliver to a platform" example. demos/build.py and docs/demos.md gain two demos: fit_blur and template_tiktok. docs/roadmap.md marks 1.14.0 done and renumbers the remaining themes.
  • tests/fixtures/mcp_tools.json regenerated: render gains template, list_templates, cues, srt, logo, title, brand, chapters, fit, output and write_project; caption, graphics and overlay gain platform (and graphics also margin, text, top, bottom, duration); look gains safe; report gains pack. Nothing was removed, renamed or made required.
  • feat: delivery templates (render.py --template, safe zones, platform presets, blurred fit, social pack, sticker/hook/meme) (#224)
  • docs: eval iteration 14 at 1.13.0 (76 prompts, 17 languages, delivery baseline) + roadmap states + external review filed (#223)
  • docs: before/after demo gallery (23 demos, demos/build.py, docs/demos.md) (#222)

What's Changed

  • docs: before/after demo gallery (23 demos, demos/build.py, docs/demos.md) by @claude[bot] in #222
  • docs: eval iteration 14 at 1.13.0 (76 prompts, 17 languages, delivery baseline) + roadmap states + external review filed by @claude[bot] in #223
  • feat: delivery templates (render.py --template, safe zones, platform presets, blurred fit, social pack, sticker/hook/meme) by @claude[bot] in #224

Full Changelog: v1.13.0...v1.14.0

Don't miss a new ffmpeg-skill release

NewReleases is sending notifications on new releases.