Automated release: version and notes generated from pull requests merged since 2.23.1.
Added
export.py --preset copy --repairremuxes a damaged file (a recording cut off mid-write, broken timestamps from a screen recorder): timestamps regenerated, corrupt packets dropped, negative timestamps shifted to zero, the input untouched. Decode errors and timestamp warnings are counted before and after; errors a remux cannot fix are named.export.py --max-mb MBfits a delivery under a size limit (an email attachment, a chat app's upload cap): a two-pass x264 encode at the bitrate the running time leaves after the audio, with the written size measured. A size too small for a watchable picture (under 100 kb/s) is refused before anything runs.- Every writing tool reports
output_identity: {size, mtime_ns}, andcheck.py --expect-identity SIZE:MTIME_NSchecks against it. A check run after a write that failed, leaving an older file at the path, or after another run replaced it, used to grade whatever was there; with the flag anidentityrow FAILs instead. check.py reports the file it graded asinput_identity. SKILL.md's delivery check passes it. check.py --compare REFmeasures the picture against a reference: mean SSIM, the worst frame and its time, and mean PSNR, in one pass; WARN under a mean SSIM of 0.98. Frames of another size are not compared.join.py --copy --transition nonejoins clips by stream copy, without re-encoding, when they already match: the same codec, size, frame rate, pixel format, colour tags, sample rate and channels in the first video and audio stream, no edit-list pre-roll, and picture and sound ending within 50 ms in each clip. Anything else is refused before ffmpeg runs, naming each clip and what differs (reason: join_copy_mismatch). The join is measured before it replaces anything: its video packet count must equal the clips' total and its length their summed length.cut.py --remove A-B,...drops ranges and keeps the rest, the inverse of--segments: overlapping ranges merge, a leftover shorter than one frame is not kept, and a removal that leaves nothing is refused.- SKILL.md routes the 2.24 features from plain requests: "under 25 MB" →
export.py --max-mb, "remove 1:00-1:30" →cut.py --remove, "join without re-encoding" →join.py --copy --transition none, "the recording is corrupted" →export.py --preset copy --repair, "how much quality was lost" →check.py --compare. The report format now sits above the routing table so it survives context compaction; two rows already covered elsewhere (--dry-run, VFR phone video) were dropped to stay under the 30 KB budget. - Add join.py --copy, cut.py --remove, output identity, check.py --compare, export.py --max-mb and --repair (#385)
What's Changed
- Add join.py --copy, cut.py --remove, output identity, check.py --compare, export.py --max-mb and --repair by @kajisho5 in #385
Full Changelog: v2.23.1...v2.24.0