OpenTranscode/CHANGELOG.md

8.0 KiB
Raw Blame History

Changelog

All notable changes to OpenTranscode. Versions follow semantic versioning.

4.4.3 — 2026-07-25

Fixed

  • AttributeError: 'EncoderWorker' object has no attribute 'verbose' crash on START in the launcher script's EncoderWorker.__init__. The launcher script now sets self.verbose from env.av1an_flags["verbose"], matching the package's behavior.

Added

  • UI toggle for av1an: a new "av1an (chunk-parallel)" checkbox in the options row. Default OFF = ffmpeg-only. The CLI flag --use-av1an still works; the UI toggle takes precedence when set.

Changed

  • Documentation terminology: open-transcode.py is consistently called "the launcher script" (not "single-file script"). It mirrors the 16-module opentranscode/ package; calling it "single-file" was misleading.

4.4.2 — 2026-07-25

Fixed

  • Live tail of av1an/ffmpeg stderr (│ Encoding: 1373/1376 Frames @ 51.70 fps...) was spamming the log in quiet mode in the launcher script. The package had this gated behind --verbose since v4.1.1; the launcher script now matches.
  • "FAIL: av1an exit code 1" appeared in the log even when the ffmpeg fallback succeeded, producing a confusing "FAIL then OK" double-status. The av1an failure line now goes to _vlog (verbose only); the user sees only the final outcome (OK or FAIL: av1an + ffmpeg both failed).

4.4.1 — 2026-07-25

Changed

  • Default log output reduced to two lines per file: start banner + finish status. Heartbeat (... 30s elapsed) and disk-space warnings now require --verbose. The user asked for "start + finish, nothing else"; this delivers exactly that.

4.4.0 — 2026-07-25

Added — massive-file support (30GB+ BluRay rips)

  • Per-file timeout raised from 2h to 24h, configurable via --timeout SECONDS. A 30GB 1080p BluRay rip at SVT-AV1 preset 6 takes 4-10 hours; the old 2h timeout killed massive-file encodes partway through.
  • 5%-of-source integrity check replaced with absolute 1KB minimum. The old check false-positived on high-bitrate sources (50GB BluRay → 5% = 2.5GB, but valid AV1 at CRF 32 produces 1-2GB for a 2-hour movie). The real integrity gate is the duration check (≥95% of source).
  • Disk-space pre-check warns (not aborts) if free space < source size. When scaling, also checks the temp partition (lossless intermediate can be 2-3x source size).

Changed — log noise reduction

  • Combined [N/total] filename banner + status into a single line: [1/180] filename.mkv — OK: 1.6MB -> 1.3MB (81%) (was two lines).
  • Disk-space warnings no longer fire for skipped files (the check now runs after the skip-existing check).

4.3.0 — 2026-07-25

Added — skip-existing detection

  • Probes the output file with ffprobe before encoding. If the output exists with a matching video+audio codec (and matching resolution when scaling is requested), the file is skipped. Default ON; use --force-reencode to disable.
  • Added ffprobe_codec_name field to VideoCodecProfile and AudioProfile (av1/vp9/hevc, opus/vorbis/flac/iamf).
  • Final summary now includes Skipped: N count.

Fixed — heartbeat regression

  • v4.2.1 gated the 30-second heartbeat behind --verbose, causing the "hangs on first transcode, forever timer" symptom in quiet mode. The heartbeat is now always user-facing (one line per 30 seconds during long encodes). The live tail of frame= 67 fps= 12... stays gated.

4.2.1 — 2026-07-25

Changed — quiet mode by default

  • Tech-detail log lines gated behind --verbose. Default output is two lines per file: start banner + finish status.
  • Gated: CMD: lines, live tail of av1an/ffmpeg stderr, DIAGNOSIS blocks, resolution map, pre-flight validation table, heartbeat, disk-space warnings, RETRY messages, file-type detection details.

4.2.0 — 2026-07-25

Changed — ffmpeg is the default encode path

  • av1an chunk-parallel was too fragile across distros (y4m pipe breaks, SvtAv1EncApp CLI rejects --threads, VapourSynth plugin issues, output buffering making it look hung). The default encode path is now ffmpeg-only. av1an is opt-in via --use-av1an.
  • The av1an pre-flight smoke test is skipped entirely when av1an is not requested. _on_run_clicked sets use_ffmpeg_fallback = True directly, short-circuiting the av1an code path.

4.1.2 — 2026-07-25

Fixed

  • Removed the --threads N injection into av1an's --video-params string (introduced in v4.1.0). SvtAv1EncApp (the standalone CLI av1an invokes per-chunk) does not accept --threads — only --lp (logical processors). The result was Unprocessed tokens: --threads → every chunk failed 3x → no av1an output. Thread capping now lives in av1an's --workers flag (chunk-parallel count) and in -threads for the ffmpeg fallback path (where libsvtav1 is a library).
  • params_fn signature returned to (crf, preset) -> str (v4.0.0 form).

4.1.1 — 2026-07-25

Added

  • Live progress tail — av1an's stdout/stderr emits to the GUI log as it arrives (handles both \n log lines and \r progress bar updates as line boundaries).
  • 30-second heartbeat... still encoding (Xs elapsed) every 30 seconds so the user knows the encode is alive.

Changed

  • IDEAL_THREADS_PER_WORKER raised from 4 to 6 for better per-chunk SVT-AV1 throughput. On a 28-thread Xeon, the split changed from 6×4=24 to 4×6=24 (same total, better per-chunk latency).

4.1.0 — 2026-07-25

Added — intelligent chunking

  • _compute_intelligent_worker_count() computes (worker_count, threads_per_worker) such that worker_count * threads_per_worker <= logical_threads - 1. Prevents thread oversubscription on high-core- count machines (13 workers × 28 threads = 364 active on 28 logical CPUs → kernel scheduler drowned → hard lock).
  • Per-encoder --threads N cap injected into --video-params.
  • CLI flags --max-workers N and --threads-per-worker N for overrides.

4.0.0 — 2026-07-25

Fixed — "works up until near the end, never saves chunks into a full file"

  • av1an auto-selects the Hybrid chunk method when no VapourSynth source plugins are installed. Hybrid fails on phone-recorded MP4s with sparse keyframes (scene boundaries rarely align with I-frames → segment muxer splits mid-GOP → decoder errors → y4m pipe breaks → encoder reads EOF → every chunk fails after 3 retries → no output file).
  • env_probe now probes for VapourSynth source plugins (lsmash, ffms2, bestsource, dgdecnv). When none are found, pre-sets chunk_method_override = "select" to avoid the wasted first attempt.
  • _encode_one accepts a chunk_method parameter for retry. When av1an fails with the y4m break pattern, it recursively retries with --chunk-method select and caches that choice for subsequent files.
  • --chunk-method {auto,select,hybrid,segment,ffms2,lsmash,bestsource,dgdecnv} CLI flag for forcing a specific chunk method.

Package split

  • Refactored the monolithic open-transcode.py into a 16-module opentranscode/ package. The launcher script is preserved for backwards compatibility and as the test target for mocked tests.
  • pyproject.toml for pip install -e . and python -m build.