48260c0fba
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 lines
2.2 KiB
Markdown
43 lines
2.2 KiB
Markdown
# Lyra
|
|
|
|
Self-hosted, multi-source music acquisition and library tool — a replacement for
|
|
Lidarr + NZBget. Lyra discovers, ranks, downloads, tags, and organizes music across
|
|
sources of differing quality: **Qobuz** (lossless/hi-res), **Soulseek** (P2P),
|
|
**YouTube** (universal lossy fallback), and **Spotify** (discovery/metadata only).
|
|
|
|
## Status
|
|
|
|
Built in three slices:
|
|
|
|
1. **Acquisition engine** — ✅ **done**. Resolve a request against MusicBrainz,
|
|
match/rank across Qobuz/Soulseek/YouTube, download the best source into an
|
|
isolated staging dir, verify completeness, tag (mutagen), and atomically promote
|
|
the clean album into `Artist/Album (Year)/## Title.ext`.
|
|
2. **Library manager** — ✅ **done**. Watched artists (live MB search + follow),
|
|
per-release monitor toggles + auto-monitor-future, a wanted list with retry +
|
|
quality-upgrade window, and a worker "monitor" that discovers new releases and
|
|
auto-grabs through the acquisition pipeline. Plus a **library scan** that ingests
|
|
existing on-disk albums as have + monitored + followed, and a per-artist
|
|
studio-only / show-all release-type filter.
|
|
3. **Discovery** — ⬜ **not started**. Spotify/recommendation-driven finding of new music.
|
|
|
|
**Operational notes:** the monitor is **off by default** — set `monitor.enabled=true`
|
|
(+ optional `monitor.*` tuning) in the `Config` table to activate auto-grab/upgrade.
|
|
Credentials are entered in Settings and persist across `docker compose up -d --build`
|
|
rebuilds (don't use `down -v`). Tests run against a separate `lyra_test` database (a
|
|
guard blocks the live DB). Deferred hardening + the full roadmap live in the
|
|
implementation-plan "Notes" sections under [`docs/superpowers/plans/`](docs/superpowers/plans/).
|
|
|
|
## Architecture
|
|
|
|
Three Docker containers on a home server:
|
|
|
|
- **Next.js app** — UI + API (search, request, queue, progress, settings).
|
|
- **Python worker** — all source integration (streamrip, yt-dlp, slskd client,
|
|
beets/mutagen), running the six-stage acquisition pipeline.
|
|
- **slskd** — off-the-shelf headless Soulseek daemon.
|
|
|
|
**Postgres** is the shared source of truth; a shared `/music` volume is the library.
|
|
|
|
See [`docs/superpowers/specs/`](docs/superpowers/specs/) for the full design.
|