Automated release: version and notes generated from pull requests merged since 3.8.20.
Fixed
- The decided items of #510.
- A real
render.pyrun is refused before its first stage when its--dry-runfinds that a
stage needs a filter or an encoder this ffmpeg build lacks, with the document the dry run gives
(kind, message,reason: filter_missingorencoder_missing,details, hint,stage). It cut and fit the
footage first and failed at the stage that needed the filter (--template reels --title Ton a
build without drawtext ranfit.pybeforegraphics.pywas refused). A real run now runs its
own dry run first, about a second for a template render.waveform.pywith--title,
--srtor--textdoes the same: it encoded the visualisation before its title stage was
refused. cut.py --dry-runsays that a planned stream copy may still be re-encoded: the new
possible_reencode_reasonlists thereencode_reasonvalues a real run may add to a plan of
mode: copy(tolerancewhere the copy is judged by its written length, since the dry run
does not know where a single copy lands;copy_failed,stream_lost, andconcat_fallback
for a--segmentscopy join) orsmart(smart_fallback), and anotesline says the same.
It is[]in a real run. The dry run still reads no packets for a single segment.
batch.py --dry-run's summary line says its stream copies are planned, not that they stayed
lossless.look.pyon an HDR source in a build without zscale stays a refusal (filter_missing, dry and
real); a test now pins it.
- A real
- The four #429 items of #510, as decided.
batch.py: a step that names no{out}(and no-oof its own) but writes its default output
is refused (kind: input,reason: step_writes_without_out, naming the file) and the batch
stops at that item; the later rows areskipped: "recipe_refused".metadata.py {in}as a first
step wrote<stem>_meta.mp4beside the source, the next step read the untagged source, the run
completed verified, and the next run took the new file for an item. A dry run says so with
nothing written; a real run has written that one file and says where. A step that only reads
(itsoutputis null:check.py,probe.py) is unchanged.render.pydelivers the SRT its captions stage generates from acaptions.textcue file as
<output>.srt(caption_srt), guarded with the output before the first stage; it was removed
with the work directory. It is not delivered, with acaption_srt_not_deliveredskip, when the
stage came from--cacheor the export trimmed the delivery (its cue times would be wrong).
batch.pynames a side file a step before the last wrote beside its intermediate (a
batch_side_file_not_deliveredskip) instead of losing it without a word.batch.py's cache keys a side input a step builds from the first step's{in}
(--image {in}.png) by its content, per item: an edited file was served its old output. One
built from a later step's{in}(an intermediate) cannot be keyed, so that item always runs
(cache_miss.reason: side_input_unresolved).render.py --cachealso keys the logo and font file
a stage's--brandfile names: a font replaced under the same name was served from the cache.- An interrupted render says what it kept: Ctrl-C during the export's
--normalizeloudness pass
reported "nothing was written" with the export's file at the output path; the file is now named
as kept, unverified (output), while a file that was there before and that the stage did not
change is not claimed. The work directory's files are no longer listed as "still on disk" when
the directory is removed at exit. Abatch.pyrow stopped in its last step names such a file
askept. - A second signal during the stop (Ctrl-C reaches the whole process group, and the parent then
sends SIGTERM) is ignored instead of raising from inside the cleanup the first one started; it
left the output lock and its.takeoverfile beside the output. - From the review of #537: the up-front check of a render (and
waveform.py) ran when the input
came after--(its--dry-run --jsonwere appended after it and refused, and the check was
skipped);batch.pysteps, an executed plan and the MCP server's rawargvput the flags they
add before a--too, where a batch step with--was refused.--srt FILE:LANGin a batch step
is keyed by FILE (the whole token was hashed as a path that does not exist). A batch cache entry
stored before the{out}check, for a recipe with a step that names no{out}, is not served
once (cache_miss.reason: entry_predates_output_check), so such a recipe meets the refusal. A
stoppedprojectrecipe item names a delivery its render kept (kept). A second signal to
batch.pykeeps the first one's exit code and report. A render whose--workholds the output
watches the export too.cut.py --dry-runnamestolerancefor an audio-only copy as well. - From the second review of #537: a batch step's
--brandfile (literal or built from{in}) is
keyed with the logo and font file it names, as a render stage's and a project recipe's are. An
item whose source or a side input changed while it ran is not cached
(batch_cache_inputs_changed): it was stored under the key made before, and restoring the old
file served an output made from the changed one. A stop after a render delivered its SRT reports
the video asoutput(the SRT is still named as kept).batch.py --dry-runrows carry
cut_possible_reencode_reason, which the summary line points at.
- fix: the decided items of #510 (render's up-front filter check, cut --dry-run's copy note, batch and render leftovers of #429) (#537)
What's Changed
- fix: the decided items of #510 (render's up-front filter check, cut --dry-run's copy note, batch and render leftovers of #429) by @kajisho5 in #537
Full Changelog: v3.8.20...v3.8.21