Add a Requirements/Install/Run-from-source/Tests section (runtime tools, Debian & Arch package lists, pip install, source-tree launch, pytest). Correct the feature descriptions to match the code: High profile is automatic 2-pass VBR (fewest discs, then fill); split discs now get a per-disc menu when the project menu is enabled; add a Reliability section covering the deadlock-proof I/O, error reporting, and test suite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.4 KiB
DeVeDe-NG — Hardsub & Auto-split Fork
This is a fork of DeVeDe-NG aimed at producing burn-ready NTSC DVDs from arbitrary video files, with three additions on top of upstream:
- Embedded subtitle detection + hardsubbing (burn-in).
- Selectable DVD encode profiles (Compatibility / High quality / Custom).
- Automatic splitting of over-long projects across multiple ISOs / DVD-Rs.
It also hardens the app itself: a test suite, deadlock-proof subprocess handling, and clearer error reporting (see Reliability below).
The baseline encode is modelled on the known-good script in
contrib/dvd-safe-converter.sh.
Requirements
Runtime tools (must be on PATH):
ffmpegandffprobe— encoding and media analysis (the default backend).dvdauthor— builds the DVD-Video structure.mkisofsorgenisoimage— creates the ISO image.spumux(part of dvdauthor) — for soft (selectable) subtitles.- Optional: a player for preview (
vlc,mpv, ormplayer) and a burner (brasero,k3b, orxfburn).
Python / GUI: Python ≥ 3.12, GTK 3, PyGObject (gi), and pycairo.
On Debian/Ubuntu:
sudo apt install ffmpeg dvdauthor genisoimage \
python3 python3-gi gir1.2-gtk-3.0 python3-cairo python3-gi-cairo \
vlc # optional: preview player
On Arch:
sudo pacman -S ffmpeg dvdauthor cdrkit gtk3 python-gobject python-cairo \
vlc # optional: preview player
Install
sudo python3 -m pip install .
# if pip refuses on an externally-managed system:
sudo python3 -m pip install --break-system-packages .
Then launch it from your menu or run devede_ng.
Run from source (no install)
Best for trying it out or developing — runs straight from the checkout:
PYTHONPATH=src python3 -c "import devedeng.devedeng as d; d.py()"
Tests
python3 -m pip install --break-system-packages pytest # one-time
python3 -m pytest
The suite is headless (no display, no encoding) and runs in CI on Codeberg
(.forgejo/workflows/tests.yml).
1. Hardsubbing embedded subtitles
The analyzer (ffprobe/avprobe) detects embedded subtitle tracks and
classifies each as text (SubRip/ASS/mov_text/WebVTT) or image
(PGS/VOBSUB/DVD subtitle). In a movie's Subtitles properties page a
"Burn in embedded subtitle" dropdown lets you pick one track to render
permanently into the picture.
- Text subs are burned with ffmpeg's
subtitles=(libass) filter, applied after scaling to the DVD size. - Image subs are composited with an
overlayfiltergraph before scaling, so bitmap positioning stays aligned with the source frame. (OCR-to-text is a planned option; today the bitmap is overlaid directly.)
Burned-in subtitles are part of the video; the existing soft subtitle support (spumux subpicture streams from external files) is unchanged.
2. Encode profiles
A project-level Encode profile selector sits next to the disc-size control (DVD only). NTSC DVD audio is AC3 for all profiles (upstream used MP2 for NTSC), matching the baseline script and maximising player compatibility.
| Profile | Video | Audio | Notes |
|---|---|---|---|
| Compatibility (4500k) | CBR 4500k | AC3 192k | Old-player-safe baseline (~133 min / single-layer disc). |
| High quality (fill disc) | 2-pass VBR, auto | AC3 448k | Picks the fewest discs that hold the project, then raises the bitrate (up to ~9000k) to fill each disc. |
| Custom | your kbps | your kbps | Advanced; clamped to stay within DVD spec. |
Selecting Custom reveals video/audio kbps fields.
3. Splitting long projects across discs
Usable disc capacity comes from the selected disc size (with the existing ~10% safety margin). When a project does not fit on one disc at the chosen quality, you are asked whether to:
- Split into N discs — keep the quality and author one DVD/ISO per disc
(
name-disc1.iso,name-disc2.iso, …), or - Reduce bitrate — squeeze everything onto a single disc (upstream behaviour), or Cancel.
Multiple titles are distributed across discs whole. A single movie larger than one disc is split by time at the chapter boundary nearest each disc's capacity (falling back to an even time cut when it has no chapters); each segment's chapter markers stay inside the segment. If the project has a menu enabled, each split disc gets its own menu listing that disc's titles; otherwise each disc auto-plays.
Reliability
This fork also reworks the app's process handling and error reporting:
- Deadlock-proof subprocesses. Child output is drained by background reader threads, so a long encode can't be wedged by a stalled/closed GUI (the encoders even keep running if the editor/terminal that launched the app dies).
- Clear errors. A failed job leads with the step that failed, its command, and the last lines of its output — with the full log still available.
- Test suite + CI guard the split planner, bitrate math, generated ffmpeg commands, subtitle detection, and the subprocess I/O.
Known limitations
- Burning multiple discs is done one at a time: the app produces the ISOs; burn each in turn.
- Image-subtitle burn-in is supported by the ffmpeg backend; the legacy avconv backend handles text subtitles only.
- See ROADMAP.md for what's planned next.