Jonathan c75b9d3562 fix: force IPv4 in worker, count real Qobuz files, flatten nested output
- worker had no IPv6 route -> Qobuz CDN (dual-stack) failed ~half the tracks
  with 'Network is unreachable'; disable IPv6 in the container (IPv4 only).
- StreamripClient counted metadata tracks (always full) -> a partial download
  falsely imported; now count the actual files written (short count -> needs_attention).
- streamrip writes into a nested 'Artist - Album [..]/' folder the tagger never saw;
  flatten audio files up into the album dir so tagging/organization runs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 01:01:23 +02:00

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

Early design. Built in three slices:

  1. Acquisition enginein progress. Given an album/track, find the best available source, download it, tag it against MusicBrainz, and file it into a clean library.
  2. Library manager — Lidarr-style monitoring, wanted lists, auto-grab of new releases.
  3. Discovery — Spotify/recommendation-driven finding of new music.

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/ for the full design.

S
Description
Self-hosted multi-source music acquisition tool replacing Lidarr (Qobuz/Soulseek/YouTube/Spotify)
Readme 2.5 MiB
Languages
Python 50.8%
TypeScript 45.3%
CSS 3.6%
Dockerfile 0.2%
Shell 0.1%