RustifyDL
Why RustifyDL?
Turn any Spotify track/album/playlist URL into properly tagged audio files. RustifyDL pairs Spotify metadata with audio from YouTube, then writes tidy tags and artwork so your library looks right everywhere.
Features
- ⚡ Concurrent downloads for maximum speed
- 🏷️ Accurate tags: artist, album, track/disc numbers, genre, year, cover art
- 🔇 Clean, minimal logging (tune with verbosity levels)
- 🧰 FFmpeg-based conversion (choose bitrate/format)
- 📚 Library and CLI - use as a Rust crate or standalone binary
Demo
RustifyDL in action: downloading a Spotify album
Installation
From crates.io (Recommended)
cargo install rustifydl
From source
Prerequisites:
- FFmpeg on PATH
git clone https://github.com/ThePangel/RustifyDL.git
cd RustifyDL
cargo install --path . --force
Usage
Command Line Interface
rustifydl "https://open.spotify.com/album/..." -v info --format mp3 --bitrate 192k --concurrent-downloads 8
Common options (see rustifydl --help for full list):
-o, --output-dirOutput folder (default:TH> ./output)--concurrent-downloadsParallel downloads (e.g., 6 or 10);N> --bitrateFFmpeg bitrate, e.g.,TE> 192k,256k,320k--formatOutput format, e.g.,XT> mp3,m4a,opus,flac-v, --verbosityEL> none,info,debug,full--no-dupesSkip duplicate track names when collecting
Library Usage
Add to your Cargo.toml:
[dependencies]
rustifydl = "0.1"
tokio = { version = "1", features = ["full"] }
Example usage:
use rustifydl::{download_spotify, DownloadOptions};
#[tokio::main]
async fn main() ->gt; Result<(), ), Boxdyn std::error::Error + Send + Sync>> {
{
let opts = DownloadOptions {
url: "https://open.spotify.com/album/xxxxxxxx".into(),
client_id: ""d>" .into(),
client_secret: ""t>" .into(),
output_dir: "./downloads".into(),
concurrent_downloads: 6,
no_dupes: true,
bitrate: "192k".into(),
format: "mp3".into(),
verbosity: "info".into(),
no_tag: false,
timeout: 60,
};
download_spotify(opts).await?;
Ok(())
}
Configuration (Automatic)
RustifyDL manages Spotify API credentials automatically. On first use it creates a config file and reuses it next time—no need to pass credentials on the command line.
Config location examples:
- Windows:
%APPDATA%/RustifyDL/config.toml - Linux:
~/.config/RustifyDL/config.toml - macOS:
~/Library/Application Support/RustifyDL/config.toml
To reset, delete the file and run again.
Project Structure
src/
├── lib.rs # Library API & orchestration
├── metadata.rs # Tag writing (lofty)
├── spotify.rs # Spotify fetch (spotify-rs)
└── youtube.rs # YouTube download (rustypipe + ffmpeg)
eg)
eg)
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Status
🚧 Active development
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Support
If you encounter issues or have questions, please open an issue.
Built with Rust 🦀 and 💖 by thepangel ^_____^