All apps · 0 apps
DVDCompress
Docker app from hovee's Repository
Overview
Readme
View on GitHubDVDCompress
Hardware-Accelerated DVD-Video & Blu-ray Transcoding, Authoring, and Burning in Docker
Features • Quick Start • Deployment • Hardware Acceleration • Optical Burning • API Reference
📖 Overview
DVDCompress is an open-source, self-hosted web application that transforms arbitrary modern video files (.mp4, .mkv, .avi, .mov, .ts, .webm, etc.) into 100% standard-compliant, standalone-playable DVD-Video (VIDEO_TS) and Blu-ray (BDMV) physical discs or ISO images.
Equipped with a real-time mathematical bitrate budget calculator, NVIDIA GPU decode/encode acceleration, automatic optical drive discovery, pause/resume queue management, and a modern responsive web interface, DVDCompress eliminates the complexity of optical authoring on home servers, Unraid, TrueNAS, and NAS systems.
✨ Features
- 🎞️ Universal Video Ingest: Accepts single videos or multi-episode season playlists in any container format, video codec (H.264, HEVC, AV1, VP9, MPEG-4), and audio codec (AC3, AAC, DTS, TrueHD, FLAC).
- 🧮 Dynamic Bitrate Budgeting Engine: Calculates optimal video and audio bitrates across $N$ inputs with precision filesystem overhead allocation (UDF/ISO 9660 + MPEG multiplexing factors) to guarantee disc fit without overflow:
- DVD-5 (Single Layer): 4.30 GiB target budget (~4,300 MB)
- DVD-9 (Dual Layer): 7.85 GiB target budget (~7,850 MB)
- BD-25 (Single Layer Blu-ray): 23.00 GiB target budget (~23,000 MB)
- BD-50 (Dual Layer Blu-ray): 46.00 GiB target budget (~46,000 MB)
- BD-66 (Dual Layer UHD): 61.50 GiB target budget (~61,500 MB)
- BD-100 (Triple Layer BDXL): 92.00 GiB target budget (~92,000 MB)
- BD-128 (Quad Layer BDXL): 118.00 GiB target budget (~118,000 MB)
- 📀 Standard-Compliant Authoring:
- DVD-Video: MPEG-2 video (NTSC 720×480 @ 29.97fps / PAL 720×576 @ 25fps), 48kHz AC3 audio,
dvdauthorVTS titlesets, 16:9 widescreen anamorphic / 4:3 aspect ratios, and selectable subtitle tracks. - Blu-ray (BDMV): H.264/AVC High Profile Level 4.1,
tsMuxeRBDMV/CERTIFICATE structures, and UDF 2.50 formatting.
- DVD-Video: MPEG-2 video (NTSC 720×480 @ 29.97fps / PAL 720×576 @ 25fps), 48kHz AC3 audio,
- 💬 Subtitle Preservation: Automatically converts PGS and SRT subtitle streams into compliant DVD subpictures (
dvdsub), selectable using standard remote control subtitle toggles. - ⏭️ Full-Movie Chapters: Preserves embedded chapter markers from source files, or automatically creates 5-minute interval chapters across the entire movie duration.
- ⚡ Hardware Acceleration: Full NVIDIA NVDEC hardware decode for all common formats, NVIDIA NVENC hardware encoding for Blu-ray streams, and multi-core CPU matrix-optimized transcoding with automatic fallback.
- ⏸️ Pause / Resume Queue Controls: Suspend in-progress transcoding or burning jobs on the fly. When a running job completes, DVDCompress automatically picks up and resumes the next queued job.
- 🔥 Direct Optical Disc Burning: Real-time SCSI/SATA/USB optical drive detection (
/dev/sr*,/dev/sg*), disc media status inspection, and rock-solid burning with buffer underrun protection viagrowisofsandcdrskin/xorriso. - 🌐 Modern Real-Time Web Interface: Live WebSocket pipeline monitoring, interactive media directory navigation, real-time transcoding FPS/speed/ETA telemetry, live CPU, RAM, and GPU/VRAM gauges, and integrated log terminal stream.
- 💿 Standalone ISO Burner: Quickly burn existing ISO files directly to disc with customizable burn speeds.
🏗 Architecture
+-------------------------------------------------------------------------+
| Docker Container |
| |
| +-----------------------+ +-------------------------------------+ |
| | Modern Web UI | <-> | FastAPI Application Server (Python) | |
| | (HTML5/CSS/Vanilla) | | - REST API & WebSocket Handler | |
| | - Telemetry Chips | | - Async Job Pipeline & Queue | |
| +-----------------------+ +-------------------------------------+ |
| | |
| +---------------------------------------+ |
| | | | |
| v v v |
| +----------------+ +-----------------+ +-----------------+ |
| | Transcoding | | Disc Authoring | | Disc Burning | |
| | - FFmpeg | | - dvdauthor | | - growisofs | |
| | - NVDEC/CUDA | | - spumux | | - cdrskin | |
| | - NVENC / CPU | | - tsMuxeR | | - xorriso | |
| | - ffprobe | | - genisoimage | | - lsscsi | |
| +----------------+ +-----------------+ +-----------------+ |
+-------------------------------------------------------------------------+
| | |
v (Volume Mounts) v (GPU Passthrough) v (Device Pass)
/media (Source Videos) --gpus all /dev/sr0, /dev/sg0
/output (Authored ISOs) (NVIDIA Runtime) (Optical Writer)
/config (App Settings)
/tmp/dvdcompress (Scratch)
🚀 Quick Start
1. Docker Compose (Recommended)
Create a docker-compose.yml file:
version: '3.8'
services:
dvdcompress:
image: hovee/dvdcompress:latest
container_name: dvdcompress
restart: unless-stopped
privileged: true
ports:
- "8080:8080"
environment:
- TZ=America/New_York
- DVDCOMPRESS_LOG_LEVEL=INFO
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all,video,compute,utility
volumes:
- /path/to/your/media:/media:ro
- /path/to/your/output:/output:rw
- /path/to/your/config:/config:rw
- /path/to/your/temp:/tmp/dvdcompress:rw
devices:
- /dev/sr0:/dev/sr0
- /dev/sg0:/dev/sg0
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu, video, compute, utility]
Launch the container:
docker compose up -d
Open your browser and navigate to: http://<your-server-ip>:8080
2. Docker CLI
GPU-Accelerated Mode (NVIDIA)
docker run -d \
--name dvdcompress \
--restart unless-stopped \
--privileged \
--gpus all \
--device /dev/sr0:/dev/sr0 \
--device /dev/sg0:/dev/sg0 \
-p 8080:8080 \
-v /mnt/media:/media:ro \
-v /mnt/dvd_output:/output:rw \
-v /mnt/appdata/dvdcompress:/config:rw \
-v /tmp/dvdcompress:/tmp/dvdcompress:rw \
-e TZ=UTC \
hovee/dvdcompress:latest
CPU-Only Mode
docker run -d \
--name dvdcompress \
--restart unless-stopped \
--privileged \
--device /dev/sr0:/dev/sr0 \
--device /dev/sg0:/dev/sg0 \
-p 8080:8080 \
-v /mnt/media:/media:ro \
-v /mnt/dvd_output:/output:rw \
-v /mnt/appdata/dvdcompress:/config:rw \
-v /tmp/dvdcompress:/tmp/dvdcompress:rw \
-e TZ=UTC \
hovee/dvdcompress:latest
🖥 Deployment Guides
Unraid OS
- Install the NVIDIA Driver plugin from Community Applications (if using an NVIDIA GPU).
- Add a new Docker Container in Unraid (or use the included
templates/DVDCompress.xml):- Repository:
hovee/dvdcompress:latest - WebUI:
http://[IP]:[PORT:8080] - Port:
8080$\rightarrow$8080 - Path 1 (Media):
/mnt/user/Media$\rightarrow$/media(Read-only) - Path 2 (Output):
/mnt/user/Media/dvd_output$\rightarrow$/output(Read/Write) - Path 3 (Config):
/mnt/user/appdata/dvdcompress$\rightarrow$/config - Path 4 (Scratch Temp):
/mnt/user/appdata/dvdcompress/working$\rightarrow$/tmp/dvdcompress - Device 1:
/dev/sr0$\rightarrow$/dev/sr0 - Device 2:
/dev/sg0$\rightarrow$/dev/sg0 - Privileged:
ON - Extra Parameters:
--gpus all --runtime=nvidia - Variables:
NVIDIA_VISIBLE_DEVICES=all,NVIDIA_DRIVER_CAPABILITIES=all,video,compute,utility
- Repository:
TrueNAS SCALE
- Go to Apps $\rightarrow$ Launch Docker Image (or Custom App).
- Configure Image:
hovee/dvdcompress:latest. - Set Port Forwarding: Host Port
8080to Container Port8080. - Configure Host Path Storage Volumes for
/media,/output,/config, and/tmp/dvdcompress. - Under GPU Resource Allocation, allocate 1 NVIDIA GPU.
- Under Device Passthrough, add
/dev/sr0and/dev/sg0with Privileged access enabled.
⚡ Hardware Acceleration
DVDCompress utilizes NVIDIA CUDA and NVDEC/NVENC to accelerate media transcoding:
| Feature | NVIDIA GPU (NVDEC/NVENC) | CPU (Fallback) |
|---|---|---|
| Decode Acceleration | Hardware NVDEC (-hwaccel cuda) |
Multi-threaded Software |
| DVD-Video Transcode | NVDEC decode + MPEG-2 Video Encoder | mpeg2video Software Encoder |
| Blu-ray Transcode | h264_nvenc Hardware Encoder |
libx264 High Profile Level 4.1 |
| Audio Processing | Multi-channel AC3 encoder (Stereo / 5.1) | Multi-channel AC3 encoder |
💿 Optical Drive Pass-Through
To enable physical disc burning from inside Docker, pass both the optical block device (/dev/sr*) and the SCSI generic device (/dev/sg*):
Identify connected optical drives on the host:
lsscsi -k # Example output: [2:0:0:0] cd/dvd ASUS BW-16D1HT /dev/sr0 /dev/sg0Verify host permissions:
ls -l /dev/sr0 /dev/sg0Pass devices to container:
devices: - /dev/sr0:/dev/sr0 - /dev/sg0:/dev/sg0
📊 Technical Specifications & Capacities
| Disc Format | Physical Type | Target Capacity | Usable Budget | Max Video Bitrate | Audio Spec | Video Standard |
|---|---|---|---|---|---|---|
| DVD-5 | Single Layer | 4.7 GB | 4,300 MB | 8,000 kbps | AC3 Stereo/5.1 (48kHz) | MPEG-2 (NTSC 720×480 / PAL 720×576) |
| DVD-9 | Dual Layer | 8.5 GB | 7,850 MB | 8,000 kbps | AC3 Stereo/5.1 (48kHz) | MPEG-2 (NTSC 720×480 / PAL 720×576) |
| BD-25 | Single Layer | 25.0 GB | 23,000 MB | 35,000 kbps | AC3 Stereo/5.1 | H.264/AVC High@L4.1 (1080p) |
| BD-50 | Dual Layer | 50.0 GB | 46,000 MB | 35,000 kbps | AC3 Stereo/5.1 | H.264/AVC High@L4.1 (1080p) |
| BD-66 | Dual Layer UHD | 66.0 GB | 61,500 MB | 35,000 kbps | AC3 Stereo/5.1 | H.264 / HEVC UHD-BD |
| BD-100 | Triple Layer BDXL | 100.0 GB | 92,000 MB | 35,000 kbps | AC3 Stereo/5.1 | H.264 / HEVC BDXL |
| BD-128 | Quad Layer BDXL | 128.0 GB | 118,000 MB | 35,000 kbps | AC3 Stereo/5.1 | H.264 / HEVC BDXL |
📡 REST API & WebSocket Reference
DVDCompress provides a full REST and WebSocket API:
GET /api/health— Application health checkGET /api/files?path=/media/...— File browser listing playable video files and ISOsPOST /api/probe— FFprobe media analysis (duration, codec, resolution, audio streams, chapters, subtitles)POST /api/calculate— Bitrate budget calculation based on input durations and disc targetGET /api/drives— Scan host system for optical drives and query disc media presenceGET /api/system— Live system telemetry (CPU %, RAM used/total, GPU %, VRAM, temp)POST /api/jobs— Create and start a transcoding/authoring/burning jobPOST /api/burn-iso— Directly burn an existing ISO file to an optical driveGET /api/jobs— Retrieve active and historical jobsGET /api/jobs/{job_id}— Get single job progress and telemetryPOST /api/jobs/{job_id}/pause— Pause an in-progress jobPOST /api/jobs/{job_id}/resume— Resume a paused jobPOST /api/jobs/{job_id}/cancel— Cancel an in-progress job and terminate child processesWS /ws/jobs/{job_id}— Real-time bidirectional WebSocket stream for progress updates and live logs
🛠 Local Development & Testing
# Clone the repository
git clone https://github.com/hoveeman/DVDCompress.git
cd DVDCompress
# Create virtual environment and install dependencies
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Run full test suite
pytest tests/ -v
# Run local development server
uvicorn dvdcompress.api:app --host 127.0.0.1 --port 8080 --reload
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
Install DVDCompress on Unraid in a few clicks.
Find DVDCompress in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Download Statistics
Related apps
Explore more like this
Explore allDetails
hovee/dvdcompress:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8080]/- Network
bridge- Shell
bash- Privileged
- true
- Extra Params
--gpus all --device /dev/sr0:/dev/sr0 --device /dev/sg0:/dev/sg0
Template configuration
Web interface port
- Target
- 8080
- Default
- 8080
- Value
- 8080
Path to your unencrypted video files (Movies, TV Shows, Home Videos)
- Target
- /media
- Default
- /mnt/user/Media
- Value
- /mnt/user/Media
Destination for created ISO images
- Target
- /output
- Default
- /mnt/user/Media/dvd_output
- Value
- /mnt/user/Media/dvd_output
Application state and configuration
- Target
- /config
- Default
- /mnt/user/appdata/dvdcompress
- Value
- /mnt/user/appdata/dvdcompress
Fast scratch space for transcoding and authoring
- Target
- /tmp/dvdcompress
- Default
- /mnt/user/appdata/dvdcompress/working
- Value
- /mnt/user/appdata/dvdcompress/working
GPU UUID or all for hardware transcoding
- Target
- NVIDIA_VISIBLE_DEVICES
- Default
- all
- Value
- all
NVIDIA driver capabilities (all, compute, video, utility)
- Target
- NVIDIA_DRIVER_CAPABILITIES
- Default
- all
- Value
- all