Repository navigation
1.0.0
Changelog
All notable changes to this project are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Versions before 1.0.0 were internal development builds and were never published;
their build numbers are kept in the (build N) suffix for continuity.
[1.0.0] - 2026-07-31 (build 83)
First public release.
Added
- Frame-accurate smart-render cutting: lossless stream copy for the interior of
each sequence, re-encoded frames only at the cut boundaries. - Automatic format detection for OTR recordings: HQ, classic HD, New HD
(Main@L3.2) and Full HD (Lavf-muxed, 25 / 50 / 59.94 fps). - Automatic
.avi→.mkvpre-conversion with a dense cue index for the formats
that need it. .otrkeydecryption viaotrtool, for both the video and the AC3 companion.- Automatic detection of the AC3 companion file, including its encrypted
.ac3.otrkeyform. - Cutlist parsing that handles blocks carrying both time-based (
Start/Duration)
and frame-based (StartFrame/DurationFrames) keys. -c, --cutlist-id— download a cutlist from cutlist.at by id, with detection of
whether it targets the same format (HQ/HD) as the video.-t, --tmdb— prefix the output filename with a TMDB id.--concat— losslessly join two already-cut files after a compatibility check.--force-encode— re-encode in full for sources that cannot be stream-copied.-n, --dry-run— build and validate the render plan without touching media.- Four output verbosity levels:
-q, default,-v,-vv. -V, --versionand-h, --help, -?.- Post-segment frame-count verification (
[CHECK]lines) comparing planned against
actual frame counts. - Documented exit codes: 0 success, 1 usage/input error, 2 external tool failure.
x264is a hard requirement. An earlierffmpeg -c:v libx264fallback was removed
before release: it could not pass the SPS-matching options (--stitchable,
--sps-id,--ref) that keep the encoded boundary frames compatible with the
stream-copied interior, and it seeked by timecode rather than by frame, risking both
seam corruption and frame-count drift. It was never exercised end to end.ffmpeg
itself is still required for the trailing encodes and forffprobe.
Security
- The credentials file is now
~/.config/CutlistDude.confonly; older filenames are
no longer read. - The script refuses to start if that file is group- or world-readable.
- Credentials are masked in all logged commands at every verbosity level.
Development history (pre-release highlights)
These were the substantive problems solved while getting to 1.0.0:
- Cutlist parser rewritten to be driven by the
[CutN]section header. Earlier
versions keyed offDuration=, which appears beforeDurationFrames=in each
block and caused sequences to be emitted twice, or with values carried over from
the previous block. - Frame numbering pinned down empirically: cutlist frame N is file frame
N-1;ffmsindex/x264/ffprobeare 0-based whilemkvmerge --split parts-framesis 1-based. Verified by extracting boundary frames as PNGs. - Duplicate frames at cut boundaries fixed — a 0-based IDR number was being
passed into the 1-basedparts-framesargument. - Off-by-one output length fixed: when a copy snaps to a later IDR it can end one
frame later than planned, so the trailing encode is now derived from the copy's
measured frame count rather than from the plan. Output length now matches the
cutlist exactly. - Multi-cut file corruption fixed: per-segment copy re-runs were all being
renamed to the first segment's filename. - IDR probing removed. Probing with a degenerate
parts-frames:N-(N+1)range
made mkvmerge forward-snap to the next keyframe instead of confirming N, so the
probe advanced one GOP per iteration and never converged on ordinary Lavf HD files.
The initial copy is its own proof: if mkvmerge produced a valid copy starting at
frame N, then N is a usable IDR. - Open-GOP trailing encodes fixed with
-flags +cgop.