feat(worker): Last.fm artist.getSimilar as a second discovery SimilaritySource

Adds LastfmSource, resolving Last.fm's often-empty artist mbid via the
injected MB browser (name->mbid cached) so every emitted SimilarArtist.mbid
is a real MusicBrainz artist MBID. Registered in build_similarity_sources,
gated on lastfm.api_key so the ListenBrainz-only path is unchanged when
unset.
This commit is contained in:
Jonathan
2026-07-13 19:23:18 +02:00
parent 284872b307
commit 146bf32f23
4 changed files with 202 additions and 2 deletions
+10 -2
View File
@@ -12,6 +12,7 @@ from lyra_worker.adapters.youtube import YouTubeAdapter
from lyra_worker.browser import MbBrowser
from lyra_worker.probe import AudioProbe
from lyra_worker.resolver import MbResolver
from lyra_worker.similarity._lastfm import LastfmSource
from lyra_worker.similarity._listenbrainz import ListenBrainzSource
from lyra_worker.similarity.base import SimilaritySource
from lyra_worker.tagger import Tagger
@@ -53,5 +54,12 @@ def build_probe() -> AudioProbe:
def build_similarity_sources(config: dict) -> list[SimilaritySource]:
"""Similarity sources for discovery. ListenBrainz needs no credentials, so it is
always constructed; per-run reachability is checked via each source's health()."""
return [ListenBrainzSource(base_url=config.get("discover.listenBrainzUrl") or "")]
always constructed; per-run reachability is checked via each source's health().
Last.fm is added only when an API key is configured."""
sources: list[SimilaritySource] = [
ListenBrainzSource(base_url=config.get("discover.listenBrainzUrl") or "")
]
key = config.get("lastfm.api_key")
if key:
sources.append(LastfmSource(api_key=key, browser=MusicBrainzBrowser()))
return sources