diff --git a/webui/static/api-monitor.js b/webui/static/api-monitor.js
index c900d824..bc86b223 100644
--- a/webui/static/api-monitor.js
+++ b/webui/static/api-monitor.js
@@ -2385,8 +2385,16 @@ async function openWatchlistArtistDetailView(artistId, artistName) {
source = spotify_artist_id ? 'spotify' : discogs_artist_id ? 'discogs' : deezer_artist_id ? 'deezer' : 'itunes';
}
if (discogId) {
+ // Watchlist discogId is a metadata-source id (Spotify/Deezer/iTunes),
+ // not a library PK — route through the Artists page inline view.
closeWatchlistArtistDetailView();
- navigateToArtistDetail(discogId, artistName, source);
+ navigateToPage('artists');
+ setTimeout(() => {
+ selectArtistForDetail(
+ { id: discogId, name: artistName, image_url: artist.image_url || '' },
+ { source: source }
+ );
+ }, 200);
}
});
diff --git a/webui/static/discover.js b/webui/static/discover.js
index e70e3b65..e0293a60 100644
--- a/webui/static/discover.js
+++ b/webui/static/discover.js
@@ -739,7 +739,14 @@ async function checkRecommendedWatchlistStatuses(artists) {
async function viewRecommendedArtistDiscography(artistId, artistName) {
closeRecommendedArtistsModal();
- navigateToArtistDetail(artistId, artistName);
+
+ const artist = { id: artistId, name: artistName };
+
+ // Recommended artists come from the metadata source — route through the
+ // Artists page's inline view so the source-provided id resolves correctly.
+ navigateToPage('artists');
+ await new Promise(resolve => setTimeout(resolve, 100));
+ await selectArtistForDetail(artist);
}
async function checkAllHeroWatchlistStatus() {
@@ -821,8 +828,21 @@ async function viewDiscoverHeroDiscography() {
return;
}
+ const artist = {
+ id: artistId,
+ name: artistName,
+ image_url: discoverHeroArtists[discoverHeroIndex]?.image_url || '',
+ genres: discoverHeroArtists[discoverHeroIndex]?.genres || [],
+ popularity: discoverHeroArtists[discoverHeroIndex]?.popularity || 0
+ };
+
console.log(`🎵 Navigating to artist detail for: ${artistName}`);
- navigateToArtistDetail(artistId, artistName);
+
+ // Hero artists are source-provided recommendations — route through the
+ // Artists page's inline view so the source id resolves correctly.
+ navigateToPage('artists');
+ await new Promise(resolve => setTimeout(resolve, 100));
+ await selectArtistForDetail(artist);
}
function showDiscoverHeroEmpty() {
@@ -4613,9 +4633,9 @@ function _renderYourArtistCard(artist) {
const watchlistClass = artist.on_watchlist ? 'active' : '';
const hasId = artist.active_source_id && artist.active_source_id !== '';
- // Navigate to standalone artist detail page (name click)
+ // Navigate to Artists page (name click) — source artist id, needs inline view
const navAction = hasId
- ? `event.stopPropagation(); navigateToArtistDetail('${escapeForInlineJs(artist.active_source_id)}', '${escapeForInlineJs(artist.artist_name)}')`
+ ? `event.stopPropagation(); navigateToPage('artists'); setTimeout(() => selectArtistForDetail({id:'${escapeForInlineJs(artist.active_source_id)}', name:'${escapeForInlineJs(artist.artist_name)}', image_url:'${escapeForInlineJs(img)}'}), 200)`
: '';
// Open info modal (card body click) — pass pool ID so we can look up all data
@@ -4794,7 +4814,7 @@ async function openYourArtistInfoModal(poolId) {
Explore
-