A high-performance, cross-platform DVD ripping application written in Rust with both GUI and CLI interfaces.
- Cross-Platform: Works on Linux, macOS, and Windows
- Multi-threaded: Efficient parallel processing for fast ripping
- Dual Interface: Modern GUI with egui or command-line interface
- HandBrake Integration: Leverages HandBrake CLI for reliable transcoding
- Remote Upload: Built-in support for rsync, scp, and sftp uploads
- DVD Detection: Automatic DVD detection and mounting
- Title Scanning: Comprehensive DVD structure analysis
- Production Ready: Robust error handling and logging
Download the latest release for your platform from the releases page:
- Linux:
copydvd-linux-x86_64orcopydvd-linux-aarch64 - macOS:
copydvd-macos-x86_64(Intel) orcopydvd-macos-aarch64(Apple Silicon) - Windows:
copydvd-windows-x86_64.exe
Make the binary executable on Unix systems:
chmod +x copydvd-*- Rust 1.70+ (install from rustup.rs)
- HandBrake CLI (
HandBrakeCLIin PATH) - Platform-specific dependencies:
- Linux:
pkg-config,libx11-dev,libxrandr-dev,libxi-dev,libgl1-mesa-dev - macOS: Xcode command line tools
- Windows: Visual Studio Build Tools
- Linux:
git clone https://github.com/sleepyyui/copydvd.git
cd copydvd
cargo build --releaseThe binary will be available at target/release/copydvd (or .exe on Windows).
Simply run the application to launch the graphical interface:
./copydvdThe GUI provides:
- DVD detection and scanning
- Title selection and preview
- Progress tracking
- Configuration management
- Upload functionality
Use the --cli flag for command-line operation:
# Basic ripping
./copydvd --cli --input /dev/dvd --output ./ripped_movies
# With specific settings
./copydvd --cli \
--input /dev/dvd \
--output ./movies \
--quality 20 \
--preset "Fast 1080p30" \
--threads 4
# Upload after ripping
./copydvd --cli \
--input /dev/dvd \
--output ./movies \
--upload \
--server example.com \
--username myuser \
--remote-path /media/movies--cli: Enable CLI mode--input <PATH>: DVD source path (default: auto-detect)--output <PATH>: Output directory--quality <NUM>: Video quality (0-51, lower = better)--preset <NAME>: HandBrake preset name--threads <NUM>: Number of concurrent ripping threads--upload: Enable upload after ripping--server <HOST>: Upload server hostname--username <USER>: Upload username--remote-path <PATH>: Remote directory path--method <METHOD>: Upload method (rsync, scp, sftp)
Configuration is stored in platform-specific locations:
- Linux:
~/.config/copydvd/config.json - macOS:
~/Library/Application Support/copydvd/config.json - Windows:
%APPDATA%/copydvd/config.json
Example configuration:
{
"handbrake_preset": "Fast 1080p30",
"video_quality": 20,
"max_threads": 4,
"output_directory": "/home/user/Movies",
"auto_upload": false,
"server_config": {
"hostname": "myserver.com",
"username": "myuser",
"remote_path": "/media/movies",
"method": "rsync"
}
}This project features a comprehensive CI/CD pipeline that automatically builds and releases binaries for all supported platforms.
- Automatic Releases: Pushes to the
v2branch trigger automated builds and releases - Cross-Platform Builds: Binaries are built for Linux (x86_64, aarch64), macOS (Intel, Apple Silicon), and Windows (x86_64)
- Changelog Generation: Release notes are automatically generated from commit messages
- Asset Upload: All platform binaries are uploaded as release assets
Use the provided script to bump versions:
# Bump patch version (0.1.0 -> 0.1.1)
./scripts/bump_version.sh patch
# Bump minor version (0.1.0 -> 0.2.0)
./scripts/bump_version.sh minor
# Bump major version (0.1.0 -> 1.0.0)
./scripts/bump_version.sh majorAfter bumping, commit and push to v2 branch:
git add Cargo.toml Cargo.lock
git commit -m "chore: bump version to X.Y.Z"
git push origin v2- Release Workflow (
.github/workflows/release.yml): Builds and releases onv2branch - CI Workflow (
.github/workflows/ci.yml): Tests and validation on all other branches - Dependency Updates (
.github/workflows/dependencies.yml): Weekly automated dependency updates
src/
βββ main.rs # Application entry point
βββ app/ # Application state and runner
βββ cli.rs # Command-line interface
βββ config.rs # Configuration management
βββ dvd/ # DVD detection, mounting, and ripping
βββ error.rs # Error types and handling
βββ gui.rs # GUI implementation (egui)
βββ upload.rs # Upload functionality
βββ utils.rs # Utility functions
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes and add tests
- Run tests:
cargo test --all-features - Run clippy:
cargo clippy --all-targets --all-features -- -D warnings - Format code:
cargo fmt --all - Commit changes:
git commit -m 'feat: add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
# Run all tests
cargo test --all-features
# Run tests without GUI
cargo test --no-default-features
# Run with coverage
cargo install cargo-llvm-cov
cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info- OS: Linux, macOS 10.15+, or Windows 10+
- RAM: 4GB minimum, 8GB recommended
- Storage: Sufficient space for ripped content (DVDs are typically 4-8GB)
- DVD Drive: Physical DVD drive or mounted ISO files
- HandBrake CLI: Required for transcoding
- Linux:
apt install handbrake-clior similar - macOS:
brew install handbrake - Windows: Download from handbrake.fr
- Linux:
- rsync: For rsync uploads (usually pre-installed on Unix systems)
- openssh-client: For scp/sftp uploads
- sshpass: For password-based SSH authentication
-
DVD Not Detected
- Ensure DVD is properly inserted and mounted
- Check permissions for DVD device access
- Verify DVD is not copy-protected beyond HandBrake's capabilities
-
HandBrake Not Found
- Install HandBrake CLI and ensure it's in PATH
- Test with:
HandBrakeCLI --version
-
Permission Errors
- Run with appropriate permissions for DVD access
- On Linux: Add user to
cdromgroup
-
Upload Failures
- Verify network connectivity and credentials
- Check SSH key setup for key-based authentication
- Ensure remote directory exists and is writable
Application logs are written to:
- Linux:
~/.local/share/copydvd/logs/ - macOS:
~/Library/Logs/copydvd/ - Windows:
%LOCALAPPDATA%/copydvd/logs/
Enable debug logging with:
RUST_LOG=debug ./copydvdThis project is licensed under the MIT License - see the LICENSE file for details.
Educational Use Only - This repository/code is provided strictly for educational purposes only. It is designed to help understand concepts and techniques in a learning environment.
- Legal Use Only: Users must comply with all local, state, national, and international laws and regulations
- No Illegal Activities: This content may not be used for any illegal, harmful, or malicious purposes
- No Warranty: This code is provided "as is" without any warranties of any kind
- User Responsibility: The end user assumes full responsibility for how they use this content
By accessing or using this repository/code, you agree to use it solely for legitimate educational purposes and in accordance with all applicable laws.