CLI tool for searching YouTube/YTMusic and downloading audio/video from 1000+ platforms
Project description
fm-dlp — Download and tag music/video from YouTube, YTMusic, and 1000+ sites
Download and tag high-quality music and video from YouTube, YouTube Music, and 1000+ sites — all from your terminal.
✨ Features
- Multi-platform Search — YouTube, YouTube Music (tracks & albums)
- 1000+ Supported Sites — Any site yt-dlp supports
- Audio/Video Formats — MP3, FLAC, MP4, MKV, WebM, and more with configurable bitrate
- Metadata Embedding — Title, artist, album tags + thumbnail (audio)
- Proxy Support — HTTP, HTTPS, SOCKS4/SOCKS5/SOCKS5h
- Cookie Support — Browser cookies for restricted content
- Parallel Downloads — Async support for multiple URLs
- Cross-platform Config — XDG, AppData, Application Support
🚀 Quick Start
Prerequisites
- Python 3.10+ & FFmpeg
Installation
pip install fm-dlp # pip
uv pip install fm-dlp # uv
pipx install fm-dlp # pipx
Usage
fm-dlp config ~/Music # Set download directory (first run)
fm-dlp search "artist" --platform yt-music # Search tracks
fm-dlp search "album" --type album # Search albums
fm-dlp download "URL" --codec mp3 --kbps 320 # Download audio
fm-dlp download "URL" --codec mp4 # Download video
📋 Commands
search — Find music
fm-dlp search <query> [--limit 10] [--platform yt-music|yt-video] [--type track|album] [--proxy URL]
| Option | Default | Description |
|---|---|---|
--platform |
yt-music |
Search platform: yt-music, yt-video |
--type |
track |
Content type: track, album |
--limit |
10 | Number of results |
--proxy |
— | Proxy URL |
download — Download audio/video
fm-dlp download <urls> [--codec CODEC] [--kbps 256] [--quiet] [--max-concurrent 5] [--cookies browser] [--proxy URL]
| Option | Default | Description |
|---|---|---|
--codec |
m4a/opus |
Audio: mp3, aac, flac, m4a, opus, vorbis, wavVideo: mp4, mkv, webm, mov, avi, flv |
--kbps |
256 | Bitrate 64–320 (audio only) |
--max-concurrent |
5 | Parallel downloads |
--quiet |
— | Suppress output |
--no-metadata |
— | Disable metadata embedding |
--cookies |
— | Browser: chrome, firefox, edge, etc. |
--proxy |
— | http://, socks5://, etc. |
config — Set download path
fm-dlp config ~/Music # Set directory
fm-dlp config # View current path
Stored in: ~/.config/fm-dlp/ (Linux), ~/Library/Application Support/fm-dlp/ (macOS), %APPDATA%\fm-dlp\ (Windows).
📖 Examples
# Search
fm-dlp search "Sewerslvt" --limit 10 --platform yt-music
fm-dlp search "usedcvnt" --type album
# Audio
fm-dlp download "URL" --codec flac
fm-dlp download "URL1 URL2 URL3" --codec mp3 --kbps 320
# Video
fm-dlp download "URL" --codec mp4
fm-dlp download "URL" --codec mkv
# Advanced
fm-dlp download "URL" --cookies firefox
fm-dlp download "URL" --proxy socks5://127.0.0.1:9050
fm-dlp download "URL1 URL2 URL3 URL4 URL5" --quiet --max-concurrent 10
📁 Project Structure
fm-dlp/
├── fm_dlp/
│ ├── __init__.py # Package initializer
│ ├── cli.py # CLI entry point (cliss)
│ ├── commands/
│ │ ├── search.py # YouTube & YTMusic search
│ │ └── download.py # Async download engine (yt-dlp)
│ └── utils/
│ ├── configer.py # JSON config manager
│ └── validator.py # Input validation & dependency checks
├── pyproject.toml
├── README.md
└── LICENSE
🔧 Requirements
| Dependency | Purpose |
|---|---|
yt-dlp |
YouTube extraction & download |
ytmusicapi |
YouTube Music API |
mutagen |
Audio metadata tagging |
platformdirs |
Cross-platform config paths |
color-kiss |
Terminal colors |
cliss |
CLI framework |
| FFmpeg | Audio/video conversion (system) |
❓ FAQ
Why fm-dlp when yt-dlp exists?
fm-dlp wraps yt-dlp's complex flags into a clean workflow: search with readable output, download with a single --codec option, and automatic metadata tagging from structured music data — no memorising flag combinations.
macOS defaults to M4A, others to Opus — why?
macOS treats M4A/AAC as first-class (Finder, Music.app, QuickTime). Linux/Windows default to Opus for superior quality at equivalent bitrates. Override with --codec.
How does CLI parsing work?
Uses cliss — a zero-dependency wrapper over argparse with type-driven arguments and async support.
Proxy support?
| Protocol | Download | Search (yt-video) | Search (yt-music) |
|---|---|---|---|
http://, https:// |
✅ | ✅ | ✅ |
socks4://, socks5://, socks5h:// |
✅ | ✅ | ❌ |
📄 License
MIT License — see LICENSE file.
🙏 Acknowledgments
- yt-dlp — Download engine
- ytmusicapi — YouTube Music API
- mutagen — Metadata tagging
- platformdirs — Config paths
- color-kiss — Terminal colors
- cliss — CLI framework
Author: Fkernel653 Repository: github.com/Fkernel653/fm-dlp PyPI: pypi.org/project/fm-dlp
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fm_dlp-3.5.5.tar.gz.
File metadata
- Download URL: fm_dlp-3.5.5.tar.gz
- Upload date:
- Size: 26.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2aaa0a9dfaf125231ee4dff4902ecee52338670c7ab9a1f5660f930ade0c6c86
|
|
| MD5 |
18cff0b1de394c074fd6e6ea8c4a1efa
|
|
| BLAKE2b-256 |
05154e945f284bdd6bcea35d371fdffbaba8b2af33ddfd17d64cacc0aa297da6
|
File details
Details for the file fm_dlp-3.5.5-py3-none-any.whl.
File metadata
- Download URL: fm_dlp-3.5.5-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
246767a0544e2ec56ebb884b3b206fc487c7a828f9c3912119a72e0ab31177a7
|
|
| MD5 |
c54579220b5f84cbe1a340c964f9d040
|
|
| BLAKE2b-256 |
9c969c022c9389e39c15b02c2993ee4cdc8d3e2aeb53b8c1edcff067e7172596
|