Automated release: version and notes generated from pull requests merged since 2.11.0.
Added
- The remaining silent fallbacks, skips and warnings are recorded. Each still prints its stderr line and is now also a
diagnosticsentry, andcontract --jsonlists every code with its bucket underjson_output.diagnostic_codes: an odd-sized frame scaled to even before encoding (odd_dimensions_scaled_even), subtitle/data streams dropped on a retry with the first attempt's error (non_av_streams_dropped, besidedropped_non_av_streams), a--dry-runmeasurement skipped for an input an earlier stage would write (measurement_input_pending),ffmpeg -encoders/-bsfsthat could not be read (ffmpeg_list_unreadable), an invalid or negativeFFMPEG_SKILL_TIMEOUT(timeout_env_invalid), the libaom fallback for a missing SVT-AV1 (av1_encoder_libaom), a CRF capped at the encoder's maximum (crf_clamped), a timeline export that does not read back (timeline_parse_failed, with the reason), and every tool's former stderr-onlywarning:line (emoji fallbacks, silent, short or duplicate inputs, memory-heavy jobs,--strip-doviwithout Dolby Vision, a numbering gap insequence.py,render.py's frame-from-preset and default--normalize). font_usedon the tools that draw text.overlay.py --text,graphics.py,caption.py(burn) andgrid.py --label autoreport{asked, file, family, how, substituted}; a family that is not installed and was drawn in another (fontconfig's answer, or Arial on Windows) is afont_substitutedfallback.- Counts for what was skipped.
cropdetect.pywindows/windows_failed;sync.py --fix-driftdrift_skipped_reason(too_short/low_confidence);caption.py --asscaption.ass_shifted/ass_unshifted/ass_malformed;silence.py --fillerfiller.matched_untimed/matched_too_long. --codec av1/proresrefusals say why.error.reason: encoder_missing(kind: missing_tool, as before) when the build's encoder list lacks the encoder;encoder_list_unreadable(kind: ffmpeg) when the list could not be read, instead of claiming the build lacks it.--hw's CPU note says the same.- The MCP server answers a line that is not JSON with a JSON-RPC parse error (
-32700,id: null) instead of dropping it.
Fixed
- A degraded or partial result is no longer reported as the asked-for one (nothing happens silently, part 2). Additive fields, plus the
batch.pyrowerrornoted below:render.py'sverifiedis the conjunction of every stage's. A stage's own verification steps (beyond its intermediate's probe) are in the result'sverification, tagged withstage, and its notes innotes, prefixed with its tool: an export that missed its platform loudness used to leave the renderverified: true. An executed plan and a pack carry their children's the same way, and a--cachehit replays what the cached stage verified.render.py's"check": {"content": true}without a platform runscheck.py --content(it was skipped without a word; a plan's check step already ran it). A check not run under--dry-runis acheck_dry_runskip, and check.py output that does not parse is a failure document (error.reason: check_output_unparsed) instead of a bare string.render.py --cachesays why each stage missed (cache.miss_reasons:not_cached,sidecar_missing,artifact_missing,sidecar_corrupt,artifact_truncated,no_output_path); a damaged entry is acache_entry_damagedwarning and an audit line in the cache directory; a failed store, an input that cannot be fingerprinted and an unreadable ffprobe banner are recorded.export.pyreportstrimmed: {from, to}(and a note) when a platform maximum cut the clip. A loudness measurement that cannot be read isloudness.measured: falsewith a failing{step: loudness, ok: false, reason: not_measured}and aloudness_not_measuredwarning, instead of no loudness block andverified: true; after--normalize, the measurement from before the pass is no longer reused.multicam.py'scutsname the camera actually rendered (camera 0 where the asked-for camera had not started), with acamera_not_startedfallback naming the one asked for.report.pylists each section it built as a verification step (loudness,compliancewithpassed,contact_sheet); one it could not build isok: falsewith the child's reason and areport_section_missingwarning, so the report is no longerverified: truewith a section missing.batch.py: a failed row'serroris the failing step's own{step, tool, kind, message, code, reason, details, hint, exit_code}(it was absent, or a string such as"1"for a worker that exited); rows addverifiedandunverified(a completed but unverified step staysok, as design-decisions decides), and the batch'sverificationhas oneitemstep per row. Ctrl-C reports a row for every input (interrupted: true, orskipped: "interrupted") and atotalthat counts them all. A cache hit is served only while its output's size and mtime are the ones the batch wrote (cache_misson the row, a warning), so an entry written by 2.10.11 or earlier runs once more; a cache file that does not parse is abatch_cache_resetwarning and an audit line. A recipe error that is the same for every item is refused before any item runs.verify.pyruns each step with--jsonand keeps the tool's ownkind,reason,messageandexit_codeinstead of the last stderr line or a fixed string; steps that do not apply are listed under each file'sskippedwith a reason.export.py's andmulticam.py's last stderr-onlywarning:lines are records too (colour_not_converted,output_audio_silent,loudness_outside_spec,sync_low_confidence), so no tool prints a warning that--jsondoes not carry.
- Nothing happens silently, parts 2 and 3: degraded results, and the remaining fallbacks, skips and warnings (#350)
What's Changed
- Nothing happens silently, parts 2 and 3: degraded results, and the remaining fallbacks, skips and warnings by @kajisho5 in #350
Full Changelog: v2.11.0...v2.12.0