This is a major release featuring playlist support, a rewritten backend, and numerous UI improvements.
🎵 Playlist Downloads
Download YouTube Music playlists, not just albums. Each track goes to its proper album folder, and an M3U file references them—no duplicates.
data/
├── Pink Floyd/
│ └── 1973 - The Dark Side of the Moon/
│ ├── 01 - Speak to Me.opus
│ └── cover.jpg
└── Playlists/
├── My Favorites.m3u
└── My Favorites.jpg
🚀 New Features
- Playlist support — Download full playlists with M3U generation and cover art (#4)
- Automatic album detection — The server now auto-detects whether a playlist URL is actually an album. Generates M3U files only on playlists.
- Max items limit — Cap tracks downloaded from a playlist
- CLI tool — Use
yubalstandalone from the command line - UI refresh — Redesigned header/footer, gradient background, real-time structured logs, playlist metadata in downloads panel
🏗️ Architecture Overhaul
- Removed beets — Metadata now comes directly from YouTube Music via
ytmusicapi, with fuzzy track matching viarapidfuzz - Monorepo structure —
yubal(core library + CLI),yubal-api(FastAPI),web(React) - Simplified config — Just two directories:
datafor output,configfor settings
⚠️ Breaking Changes from v0.1
Volumes
| Old | New |
|---|---|
/app/beets
| (removed) |
/app/ytdlp
| /app/config/ytdlp
|
Environment Variables
| Old | New |
|---|---|
YUBAL_DATA_DIR
| YUBAL_DATA
|
YUBAL_BEETS_DIR
| (removed) |
YUBAL_YTDLP_DIR
| (removed) |
| — | YUBAL_CONFIG
|
YUBAL_CONFIG is the new base config directory. Cookies go in $YUBAL_CONFIG/ytdlp/cookies.txt.
Migration
# compose.yaml
volumes:
- - ./beets:/app/beets
- - ./ytdlp:/app/ytdlp
+ - ./config:/app/configMove your ytdlp/cookies.txt to config/ytdlp/cookies.txt.
🐳 Docker Compose
services:
yubal:
image: ghcr.io/guillevc/yubal:0.2.0
ports:
- 8000:8000
environment:
YUBAL_TZ: UTC
volumes:
- ./data:/app/data
- ./config:/app/config
restart: unless-stopped💜 Support
Enjoying yubal? A small contribution helps keep the project going:
Full Changelog: v0.1.4...v0.2.0