Add a third playback source: a ListenBrainz recommendations Atom feed. Each suggestion already carries a MusicBrainz recording MBID, title and artist, so it is keyed directly by MBID (source-agnostic identity, no extra lookup) and resolved to a concrete file — Navidrome search3 first, then a yt-dlp ytsearch1: fallback. - providers/listenbrainz.py: parse the Atom/HTML feed, anti-repeat on the MBID key, resolve Navidrome-then-yt-dlp. Feed may be an http(s) URL or a local path (for testing). - subsonic.py: add search_songs (search3) for resolution. - canonicalizer.py: short-circuit when a Track already has an MBID, so feed-provided MBIDs are trusted and MusicBrainz is not hit. - __main__.py: wire the provider in; register the yt-dlp fetcher as a resolution backend even when the yt-dlp source is off; close providers on shutdown. - config/compose/.env.example: RADIEO_LISTENBRAINZ_URL + weight. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
385 B
Text
23 lines
385 B
Text
# Fichiers audio et état du cache (ne pas versionner)
|
|
/cache/*
|
|
!/cache/.gitkeep
|
|
|
|
# Secrets locaux
|
|
.env
|
|
|
|
# Liste de sources yt-dlp personnelle (garder seulement l'exemple)
|
|
/config/urls.txt
|
|
|
|
# Échantillon de feed ListenBrainz personnel
|
|
/config/recommendations.xml
|
|
|
|
# État de l'ingestion (base SQLite persistante)
|
|
/state/
|
|
*.db
|
|
*.db-journal
|
|
*.db-wal
|
|
|
|
# Python
|
|
__pycache__/
|
|
*.pyc
|
|
.venv/
|