feat(discover): on-demand Lidarr artist art for suggestions

Out-of-library suggestion artists (artist_similarity_unmatched rows)
have no local art row, so the Discover card always showed a
placeholder. Resolve art on-demand from Lidarr's artist lookup,
matched by MBID (foreignArtistId == candidate_mbid), and pass the
remote image URL straight through — no caching (a suggestion may
never be viewed; the browser fetches the URL directly).

- suggestionView gains image_url (omitempty); handler resolves it via
  bounded-concurrency Lidarr LookupArtist, best-effort, never fails
  the request.
- Lidarr is the sole source: disabled / unreachable / no-match →
  empty → existing placeholder. (No inline TheAudioDB fallback — it's
  externally rate-limited and there's no cache to amortize it.)
- web: ArtistSuggestion.image_url?; SuggestionFeed passes it to
  DiscoverResultCard (already supports imageUrl).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-16 20:16:56 -04:00
parent 9ffe33a6f2
commit a7bea43a13
3 changed files with 57 additions and 0 deletions
@@ -65,6 +65,7 @@
<DiscoverResultCard
kind="artist"
title={s.name}
imageUrl={s.image_url}
state="requestable"
attribution={attributionText(s.attribution)}
onRequest={() => onRequest(s)}