From a236974e43fd26cb30286cbed1e8ef2edf0ad93d Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Mon, 29 Jun 2026 15:39:09 -0700 Subject: [PATCH] =?UTF-8?q?discover:=20fix=20decade/LB=20tracks=20showing?= =?UTF-8?q?=20Unknown=20=E2=80=94=20normalizer=20must=20fall=20back=20to?= =?UTF-8?q?=20the=20track=20itself?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _normalizeTrack fell back to {} when there was no track_data_json, so it never read the top-level name/artists[]/album that decade (and Spotify-shaped) rows carry — every field defaulted to Unknown. Fall back to the track object itself (|| track), matching _renderTabbedTrackLists trackData = track behaviour. Flat (track_name) + nested (track_data_json) shapes still resolve. --- webui/static/discover.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webui/static/discover.js b/webui/static/discover.js index 4b1ec804..95e13f48 100644 --- a/webui/static/discover.js +++ b/webui/static/discover.js @@ -4398,7 +4398,9 @@ async function loadPersonalizedDailyMixes() { // personalized mixes, or nested under track_data_json (name/artists[]/album/…) for the decade, // ListenBrainz + Last.fm playlists. Normalize both so renderers don't print "undefined". #discover function _normalizeTrack(track) { - const td = (track && track.track_data_json) || {}; + // track_data_json when present, else the track itself (decade/Spotify-shaped rows carry + // name/artists[]/album at the top level — same fallback _renderTabbedTrackList uses). + const td = (track && track.track_data_json) || track || {}; const a0 = td.artists && td.artists[0]; return { name: td.name || td.track_name || track.track_name || 'Unknown Track',