Skip to content

Repository files navigation

DarkDM

Better than yt-dlp. Multi-threaded download manager for Linux with Chrome extension, native Rust engine, and Tauri GUI.

RustLicense

Status: ✅ Native CLI ready · 🔜 Tauri GUI in progress


Quick Start

# Download anything
darkdm descargar "https://example.com/file.zip"# YouTube, MediaFire, any site
darkdm descargar "https://www.youtube.com/watch?v=..."
darkdm descargar "https://www.mediafire.com/file/XXXX/video.rar"# Multi-threaded (8 workers)
darkdm descargar "https://cdn.example.com/large.iso" --threads 8
# Probe without downloading
darkdm info "https://example.com/file.zip"# View logs
darkdm logs
darkdm logs --follow

Features

✅ Production Ready

  • Multi-threaded downloads — Dynamic piece-splitting (XDM algorithm), 8 workers default
  • Smart resume — Crash-safe state with atomic writes, resume from any interruption
  • Site extractors — YouTube (yt-dlp), MediaFire, generic HTML analyzer
  • HLS/DASH support — Automatic ffmpeg integration for streaming protocols
  • Progress tracking — ILoveCandy Pac-Man progress bar
  • Logging system — Structured logs (console + rotating files), darkdm logs command
  • Auto-rename — Never overwrites files (file.mp4file (1).mp4)
  • Disk space check — Fails fast if insufficient space

🔜 Coming Soon

  • Tauri GUI — Desktop app with real-time progress
  • Queue manager — Multiple concurrent downloads
  • Browser integration — Chrome extension auto-capture

Installation

Prerequisites

# Arch Linux
sudo pacman -S rust cargo ffmpeg
# Ubuntu/Debian
sudo apt install rustc cargo ffmpeg
# YouTube support (optional)
pip install yt-dlp

Build from source

git clone https://github.com/JDis03/darkdm.git
cd darkdm
./init.sh
# Build CLIcd src-tauri
cargo build --release --bin darkdm
# Install
sudo cp target/release/darkdm /usr/local/bin/

Verify

darkdm --help
darkdm info "https://httpbin.org/bytes/1024"

Usage

Basic Downloads

# Download any file
darkdm descargar "https://example.com/file.zip"# Custom output directory
darkdm descargar "https://example.com/file.zip" --output ~/Downloads
# More workers (faster for large files)
darkdm descargar "https://example.com/file.zip" --threads 16
# Disable resume
darkdm descargar "https://example.com/file.zip" --no-resume

Site-Specific

# YouTube (uses yt-dlp)
darkdm descargar "https://www.youtube.com/watch?v=dQw4w9WgXcQ"# MediaFire (auto-extracts direct link)
darkdm descargar "https://www.mediafire.com/file/XXXX/file.rar"# HLS streams (uses ffmpeg)
darkdm descargar "https://cdn.example.com/stream.m3u8"

Debugging

# Verbose logging (DEBUG level)
darkdm descargar "https://example.com/file.zip" --verbose
# Custom log level
RUST_LOG=trace darkdm descargar "https://example.com/file.zip"# View logs
darkdm logs -n 50
darkdm logs --follow
# Probe URL (no download)
darkdm info "https://example.com/file.zip"

Architecture

┌─────────────────────────────────────────────────────────────┐
│ darkdm CLI │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. Probe URL │
│ ├─ HEAD request → size, resumable, content-type │
│ └─ Detect HTML → trigger extraction │
│ │
│ 2. Extract (if needed) │
│ ├─ YouTube → yt-dlp (HLS manifest) │
│ ├─ MediaFire → scrape HTML │
│ └─ Generic → <video>, <audio>, <a href> tags │
│ │
│ 3. Download │
│ ├─ Multi-threaded (8 workers, dynamic piece-split) │
│ ├─ Range requests (HTTP 206 Partial Content) │
│ ├─ TransactedIO (crash-safe state, atomic writes) │
│ ├─ Progress bar (ILoveCandy Pac-Man) │
│ └─ Auto-resume on interruption │
│ │
│ 4. Post-process │
│ ├─ HLS/DASH → ffmpeg merge │
│ └─ Auto-rename if file exists │
│ │
└─────────────────────────────────────────────────────────────┘
↓
~/Descargas/DarkDM/file.mp4

Key Algorithms (ported from XDM)

  • Dynamic piece-splitting — Work-stealing, not static N-parts
  • TransactedIO — 3-file rotation, atomic rename(2) for crash safety
  • ContinueAdjacentPiece — Reuse TCP connections between pieces
  • Accept-Encoding: identity — Critical for accurate Range calculations

Documentation


Project Status

FeatureStatusNotes
Multi-threaded download✅ Done8 workers, dynamic piece-splitting
Resume support✅ DoneCrash-safe TransactedIO
Site extractors✅ DoneYouTube, MediaFire, generic HTML
HLS/DASH support✅ Doneffmpeg integration
Progress bar✅ DoneILoveCandy Pac-Man
Logging system✅ Donetracing + rotating files
CLI interface✅ Doneclap, descargar/info/logs
Tauri GUI🔜 NextDesktop app with real-time progress
Queue manager🔜 NextMultiple concurrent downloads
Browser extension🔜 NextAuto-capture from Chrome

Tests: 38/38 passing · Build:./init.sh passes


Tech Stack

  • Rust — Core engine (reqwest, tokio, async-trait)
  • tracing — Structured logging with file rotation
  • clap — CLI argument parsing
  • scraper — HTML parsing for site extractors
  • yt-dlp — YouTube extraction (external)
  • ffmpeg — HLS/DASH merging (external)
  • Tauri — Desktop GUI (coming soon)

Contributing

  1. Fork the repo
  2. Create a feature branch (git checkout -b feat/amazing)
  3. Run tests (cargo test --lib)
  4. Commit (git commit -m 'feat: add amazing feature')
  5. Push (git push origin feat/amazing)
  6. Open a Pull Request

Development:

# Run tests
cargo test --lib
# Build CLI
cargo build --release --bin darkdm
# Verify
./init.sh

License

MIT — See LICENSE for details.


Acknowledgments

  • XDM — Algorithms for dynamic piece-splitting and crash-safe state
  • yt-dlp — YouTube extraction backend

Built with ❤️ for Linux power users

About

Video Download Manager for Linux

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages