[1.3.1] - 2025-09-22
Added
-
Output filename templating (opt-in):
- New CLI flag:
--output-template— provide a lightweight template for auto-generated outputs when you don't supply--outputexplicitly. Supported tokens:{title},{year},{stem},{source},{lang},{channels},{worker},{delay}. --output-preview— preview the rendered filename without performing any work (safe dry-run for templates).- Template behavior mirrors the automatic filename generator's delay semantics (prefers mediainfo delay, falls back to filename parsing, and injects
[DELAY 0ms]when a delay was stripped and ignore was requested).
- New CLI flag:
-
Tests: Added unit tests covering the template renderer and delay flag helper to ensure consistent behavior across edge cases (token substitution, sanitization, filename delay parsing, TV season/episode handling, and delay injection behavior).
-
Default bitrates setting for AC4.
-
--parse-elementary-delay- When input is an elementary (demuxed) stream, parse any delay in the filename and reset it to zero. -
--working-dir- Set a centralized working directory for job files, logs, and batch-results. Overrides config default when provided. -
--batch-summary-output- Path to write a JSON summary for a batch run. When provided, a single JSON file with per-file metadata (status, durations, log file, output path) is emitted. -
--batch-output-dir- When supplied, encoders will place generated outputs into this directory unless the user explicitly supplied--outputfor a job. Useful for centralized batch storage. -
--overwrite- encode flag to allow overwriting existing output files. When not set, the CLI will fast-fail/skips jobs whose target outputs already exist. -
--max-parallel- Integer (default 1). Controls how many files are processed concurrently in batch mode. -
--max-logs- Integer to retain a maximum number of log files in the working logs directory; older logs are trimmed automatically. -
--max-batch-results- Integer to retain a maximum number of batch result JSON files in the working batch-results directory; older results are trimmed. -
Centralized atomic move helper in the DEE encoder base class to perform safe, fast output file placement. Uses an atomic replace when possible and falls back to a cross-filesystem-safe move when needed.
-
DRY refactor: replaced per-encoder unlink+move logic with the centralized helper across DD, DDP, Atmos and AC4 encoders. This unifies overwrite semantics and reduces duplicated code.
-
Automatic filename generation has been greatly improved:
- Will check for common attributes via the mediainfo/input name and append that to the automatically generated file name.
- Detects name, year, season, episode and adds them to the name when generating a new name.
-
CLI:
--temp-dir- When supplied, encoders now create a predictable per-input subfolder under the provided base directory:<temp-dir>/<input_stem>_deezy. This centralizes temporary artifacts while keeping them isolated per-source for safe reuse and selective cleanup.--reuse-temp-files- Opt-in flag that enables reusing extractor outputs (FFmpeg / TrueHDD) when the extractor command signature matches a previously saved extraction. When--reuse-temp-filesis used the encoder registers metadata about the extraction so subsequent runs can reuse it. This flag implies--keep-temp(temp files are preserved when reuse is requested).
-
Encoders / Internal:
- Temporary artifact filenames are now codec-scoped (for example:
{output_stem}.DD.wavor{output_stem}.DDP_BLURAY.wav) to avoid cross-variant collisions when a shared temp folder is used. - Per-encoder metadata is stored in a single metadata file inside the temp folder and now uses an
"encoders"map to keep signatures and produced filenames isolated per encoder/format. - Metadata writes use atomic same-directory replace semantics (write a tmp file then os.replace) to avoid partially written files.
- Temporary artifact filenames are now codec-scoped (for example:
-
Concurrency & phase limits:
- New CLI flags:
--limit-ffmpeg,--limit-dee,--limit-truehddallow fine-tuning concurrency for each heavy phase. - If per-phase flags are not provided, each phase defaults to the value of
--max-parallel. - Exception: the DEE phase defaults to a conservative fraction of
--max-parallel(roughly half) to avoid saturating CPU/IO on slower machines; users can override with--limit-dee. - Values greater than
--max-parallelare capped to--max-paralleland a warning is emitted at startup. --jitter-msflag: introduces a small randomized delay before heavy phases to reduce thundering-herd spikes in high-parallel runs.
- New CLI flags:
-
Added support for optional per-source default bitrate sections in the configuration file under
[default_source_bitrates.<codec>](for example[default_source_bitrates.ddp]).- Keys are
ch_1..ch_8and are opt-in (the generateddeezy-conf.tomlcontains commented example blocks). Encoders will use these values when no CLI/preset bitrate is provided. Encoders validate config values and will select the closest allowed bitrate if a configured value is not permitted. Precedence is: CLI > per-source config > format-level config > built-in defaults.
- Keys are
Changed
-
Config Breaking Change:
[default_bitrates.ddp_bluray]needs to be renamed to[default_bitrates.ddp-bluray]to match the codec properly. This will be automatic if you generate a new config, otherwise you should make this change manually if using the config.- Updated some of the default bitrates in the generated config.
-
Config: Use platform-aware user config location and unified Windows folder
ConfigManagernow prefers a stable user config location when no explicit
config path is provided. The search order is: current working directory
(per-project) → user config directory (platform default) → working dir
beside the executable (for bundled/exe usage).- On Windows the user config file will be placed in a single
deezyfolder
under your local app data (for example:%LOCALAPPDATA%\deezy\deezy-conf.toml). deezy config generatenow writes to the user config dir by default when
no path is supplied. This makes config placement deterministic across
installations while preserving portable per-executable configs.
-
Parsing delay from filename:
- When a file is in it's elementary format (demuxed by itself) and there is a delay string we will parse it and zero it out if
--parse-elementary-delayis used. This will effectively set the audio to 0ms delay during encoding as well as strip it from the filename.- If the user explicitly defines an output file name no logic will be ran on the output file (as to not change the users desired output name).
- If
--parse-elementary-delayis not used, delays will be handled like they was previously in containers and no logic will be ran against elementary files.
- When a file is in it's elementary format (demuxed by itself) and there is a delay string we will parse it and zero it out if
-
Improved language detection for elementary formats.
-
Updated default config.
-
Temp directories by default now get built beside the input file (but can go to a parent folder if specified by the user).
-
DEE json output files are now suffixed with
input_file_name.encoder.json. -
Refactor: DRYed up delay-handling logic across DEE encoders by adding a shared helper in the DEE base encoder. This centralized computation for template-related delay flags and reduced duplicate code across DD, DDP, Atmos and AC4 encoders.
Fixed
- Codec channel/bitrate defaults from config was not being set.
- Encoder DD doesn't support DPLII, so FFMPEG is used when DPLII is requested. This has been fixed.