diff --git a/webui/static/api-monitor.js b/webui/static/api-monitor.js
index bc86b223..c900d824 100644
--- a/webui/static/api-monitor.js
+++ b/webui/static/api-monitor.js
@@ -2385,16 +2385,8 @@ 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();
- navigateToPage('artists');
- setTimeout(() => {
- selectArtistForDetail(
- { id: discogId, name: artistName, image_url: artist.image_url || '' },
- { source: source }
- );
- }, 200);
+ navigateToArtistDetail(discogId, artistName, source);
}
});
diff --git a/webui/static/discover.js b/webui/static/discover.js
index e0293a60..e70e3b65 100644
--- a/webui/static/discover.js
+++ b/webui/static/discover.js
@@ -739,14 +739,7 @@ async function checkRecommendedWatchlistStatuses(artists) {
async function viewRecommendedArtistDiscography(artistId, artistName) {
closeRecommendedArtistsModal();
-
- 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);
+ navigateToArtistDetail(artistId, artistName);
}
async function checkAllHeroWatchlistStatus() {
@@ -828,21 +821,8 @@ 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}`);
-
- // 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);
+ navigateToArtistDetail(artistId, artistName);
}
function showDiscoverHeroEmpty() {
@@ -4633,9 +4613,9 @@ function _renderYourArtistCard(artist) {
const watchlistClass = artist.on_watchlist ? 'active' : '';
const hasId = artist.active_source_id && artist.active_source_id !== '';
- // Navigate to Artists page (name click) — source artist id, needs inline view
+ // Navigate to standalone artist detail page (name click)
const navAction = hasId
- ? `event.stopPropagation(); navigateToPage('artists'); setTimeout(() => selectArtistForDetail({id:'${escapeForInlineJs(artist.active_source_id)}', name:'${escapeForInlineJs(artist.artist_name)}', image_url:'${escapeForInlineJs(img)}'}), 200)`
+ ? `event.stopPropagation(); navigateToArtistDetail('${escapeForInlineJs(artist.active_source_id)}', '${escapeForInlineJs(artist.artist_name)}')`
: '';
// Open info modal (card body click) — pass pool ID so we can look up all data
@@ -4814,7 +4794,7 @@ async function openYourArtistInfoModal(poolId) {
Explore
-