Parallel Downloader (pd) ๐ฆ
A robust, concurrent file downloader built in Rust. It is designed to be resilient, supporting automatic retries, crash recovery, and download verification.
๐ Features
- Concurrency: Downloads files in parallel chunks to maximize bandwidth.
- Resiliency: Automatically retries failed chunks on network timeouts.
- Crash Recovery: Saves progress to a state file (
.state.json). If the program crashes or is interrupted, simply run the command again to resume exactly where it left off. - Rate Limiting: Optional token-bucket throttling to limit bandwidth usage.
- Integrity Check: Verifies the final file against a SHA-256 hash.
- Library Support: Logic is separated from the CLI, allowing you to use the core downloader in your own Rust applications.
- ๐ง Batch Processing:
- Supports a Daemon mode (
pd start) for background management. - Accepts input files (
-i list.txt) for bulk downloads.
- Supports a Daemon mode (
๐ฆ Installation
Pre-built Binaries
Download the latest release for Windows, Linux, or macOS from the Releases Page.
Build from Source
Note: The CLI binary is provided in src/bin/pd/main.rs (the CLI glue is in src/bin/pd/). When developing from source you can run the binary directly with:
# Run the library's CLI binary from source
๐ Usage
1. Standalone Mode (CLI)
Best for quick, one-off downloads.
# Simple download (defaults to 4 threads)
# Advanced Usage
2. Batch Mode
Download a list of URLs (one per line).
# Download files from list.txt, 3 files at a time
3. Daemon Mode (Background Service)
Best for long-running servers or managing queues.
# 1. Start the daemon in a separate terminal
# 2. Add downloads from any terminal
# 3. Check status
# 4. Shutdown
Options
| Flag | Description | Default |
|---|---|---|
--url, -u |
The URL to download | Required |
--output, -o |
Output filename | output.bin |
--threads, -t |
Number of concurrent threads | 4 |
--rate-limit |
Max speed in bytes/sec (e.g., 1048576 = 1MB/s) | Unlimited |
--verify-sha256 |
Hash string to verify file integrity | None |
--dir, -d |
Directory to store downloads | Current Dir |
--input, -i |
Input file with list of URLs (one per line) | None |
--concurrent_files, -c |
Number of concurrent downloads in batch mode | 3 |
Configuration
This project supports reading settings from a config.toml file or from
environment variables prefixed with PD.
-
File locations (platform-specific):
- Linux:
~/.config/pd/config.toml - macOS:
~/Library/Application Support/pd/config.toml - Windows:
%APPDATA%\pd\config.toml
- Linux:
-
Example: copy
config.example.tomlto one of the locations above and edit values such asthreads,rate_limit,default_dir, andconcurrent_files. -
Environment variables: you can override values via environment variables using
__as a separator. For example:
# set threads to 8
# set global rate limit to 1 MiB/s
Environment variables take precedence over values found in config.toml.
๐ Library Usage
You can use parallel_downloader as a library in your own project.
Add to your Cargo.toml:
[dependencies]
parallel_downloader = { version = "0.2", default-features = false }
Use the modules in your code:
use prepare_download;
use download_chunk;
๐งช Testing
We use wiremock to simulate HTTP failures and chunk ranges without hitting real servers.
๐ Examples
The repository includes runnable examples in the examples/ folder to demonstrate how to use parallel_downloader programmatically in your own applications.
Simple Download
This example demonstrates a complete workflow: creating a client, verifying file size, and downloading chunks with a progress bar.
To run the example:
You can view the full source code in examples/simple_download.rs.