Skip to content

1.0.0

Choose a tag to compare

@xwitty xwitty released this 02 Aug 14:46
· 3 commits to main since this release

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 → .mkv pre-conversion with a dense cue index for the formats
    that need it.
  • .otrkey decryption via otrtool, for both the video and the AC3 companion.
  • Automatic detection of the AC3 companion file, including its encrypted
    .ac3.otrkey form.
  • 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, --version and -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.
  • x264 is a hard requirement. An earlier ffmpeg -c:v libx264 fallback 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 for ffprobe.

Security

  • The credentials file is now ~/.config/CutlistDude.conf only; 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 off Duration=, which appears before DurationFrames= 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/ffprobe are 0-based while mkvmerge --split parts-frames is 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-based parts-frames argument.
  • 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.