Jonathan caa0d542ea fix: MD5-hash Qobuz password and never log credential-bearing login errors
streamrip's email/password login expects the MD5 digest, not plaintext
(caused 'Invalid credentials'). Also wrap login() so streamrip's exception —
which embeds the email/password/app_id — can never reach the worker logs;
re-raise a clean credential-free RuntimeError instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 00:30:34 +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%