Continuing the same external audit report's architecture/data-integrity/reliability findings:
_contract.pydeclaredencoder:aacunconditionallyrequiredforaudio.py,
loudness.pyandjoin.py, but all three pick their audio codec from the output
extension viaaudio_codec_for()(falling back to AAC only when the extension
isn't otherwise covered) -- sodoctorreported these tools entirely unusable
on an ffmpeg build without an AAC encoder, even though they can still produce
e.g. a.flacoutput with no AAC involved at all. Moved tooptionalwith a
when, matching the patterncut.py/silence.pyalready used;join.py's
libx264requirement was similarly conditioned on joining video inputs.
export.py's AACwhenalso named "any preset except gif", thoughprores
(pcm_s16le) andcopy(stream copy) don't use AAC either -- corrected.batch.py's--recipeproject mode ({"project": "p.json", "clip_key": N})
computed its cache key by hashing only that small outer dict, never the
referenced project file's own content -- so editingp.json(an export preset
swapped fromcopyto a real re-encode, captions text, anything) without
touching the recipe file itself left the cache key unchanged, and the stale
cached output was silently served for the new settings. Fixed by folding the
referenced file's content into the key.batch.py's cache file was written with a plainwrite_text(), not atomic --
a process killed mid-write left a truncated file that the next run's
json.loads()treats as corrupt and silently discards, losing every prior
cache entry, not just the interrupted one. Fixed via a sibling temp file +
os.replace().render.py's default work directory name came only from the output path (e.g.
final_work), with no PID or timestamp -- two concurrentrender.pyruns
targeting the same output (abatch.py"project" recipe processing several
files in parallel, or simply two runs by mistake) shared the same work
directory and clobbered each other's same-named intermediates mid-run. Fixed
by suffixing the auto-derived default with this process's PID (an explicit
--workis left as given, since the caller asked for that exact path).bin/install.jsdeleted an existing install (rmSync) before copying the new
one in -- normal install, not just--uninstall. A process killed partway
through the copy (Ctrl-C, disk full, a permission error) left the target
either empty or half-populated, destroying a working previous install for
nothing worse than an interrupted upgrade. Confirmed live: a simulated crash
mid-copy left the target directory completely empty, an existing marker file
gone. Fixed by copying into a scratch directory next to the real target first,
then swapping it into place with a single rename.
What's Changed
- Fix escape_drawtext() semicolon/quote gaps, and grid.py --pad's audio by @kajisho5 in #113
- Update brand assets: new logo, icon, and social preview image by @kajisho5 in #114
- Fix caption.py's --font not sanitised for ASS Style/force_style by @kajisho5 in #115
- Fix two more caption.py delimiter bugs: ASS override injection, SRT blank-line split by @kajisho5 in #116
- Fix a silent false-PASS in check.py, an infinite loop in multicam.py, and a silent output collision in batch.py by @kajisho5 in #117
- CI: retry Windows ffmpeg install on Chocolatey's transient 503s by @kajisho5 in #119
- Fix silence.py breaking on audio-only WAV, unvalidated --fps, and a LUT-strength inversion in color.py by @kajisho5 in #118
- Add release-drafter: a running draft release, updated as PRs merge by @kajisho5 in #121
- Fix render.py silently dropping fit.height and multicam.py's drift-trim ordering by @kajisho5 in #122
- Replace README logo with a transparent-background version by @kajisho5 in #123
- Fix the MCP server crashing on a non-object JSON-RPC line by @kajisho5 in #120
- Fix batch.py arbitrary script execution, and four fit/background/caption/freeze correctness bugs by @kajisho5 in #124
- Fix a contract/reality mismatch on AAC, three batch.py/render.py reliability bugs, and a non-atomic installer by @kajisho5 in #125
- Add a Sponsor badge to the top badge row by @kajisho5 in #126
- Fully automate releases: auto-tag + GitHub Release + npm publish on main push by @kajisho5 in #127
Full Changelog: v0.16.0...v0.16.11