From 28958a79af6da6741ddf4960d178692115c27891 Mon Sep 17 00:00:00 2001 From: kmmiio99o Date: Thu, 2 Jul 2026 14:13:34 +0200 Subject: [PATCH] fix(multi-scrobbler): handle extended API format for artist/album fields Last.fm/Libre.fm API with extended=1 returns artist as { "#text": "...", mbid: "..." } not { name: "..." }. Added resolveField helper that handles string, #text, and alt key formats to prevent missing artist/album data. --- .../multi-scrobbler/src/services/LastFmService.ts | 12 +++++++++--- .../multi-scrobbler/src/services/LibreFmService.ts | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/plugins/multi-scrobbler/src/services/LastFmService.ts b/plugins/multi-scrobbler/src/services/LastFmService.ts index 8443eb8..ae9a29a 100644 --- a/plugins/multi-scrobbler/src/services/LastFmService.ts +++ b/plugins/multi-scrobbler/src/services/LastFmService.ts @@ -107,6 +107,12 @@ export class LastFmService extends BaseService { ? parseInt(lastTrack.date.uts) : Math.floor(Date.now() / 1000); + const resolveField = (v: any, altKey = "name"): string => { + if (!v) return ""; + if (typeof v === "string") return v; + return v["#text"] ?? v[altKey] ?? ""; + }; + let duration: number | null = null; let endTime: number | null = null; @@ -116,7 +122,7 @@ export class LastFmService extends BaseService { const trackInfoParams = new URLSearchParams({ method: "track.getInfo", track: lastTrack.name, - artist: lastTrack.artist.name, + artist: resolveField(lastTrack.artist), api_key: currentSettings.apiKey, format: "json", }); @@ -144,8 +150,8 @@ export class LastFmService extends BaseService { const track: Track = { name: lastTrack.name, - artist: lastTrack.artist.name, - album: lastTrack.album["#text"], + artist: resolveField(lastTrack.artist), + album: resolveField(lastTrack.album, "title"), albumArt, url: lastTrack.url, date: lastTrack.date?.["#text"] ?? "now", diff --git a/plugins/multi-scrobbler/src/services/LibreFmService.ts b/plugins/multi-scrobbler/src/services/LibreFmService.ts index 5652a17..c0f1705 100644 --- a/plugins/multi-scrobbler/src/services/LibreFmService.ts +++ b/plugins/multi-scrobbler/src/services/LibreFmService.ts @@ -110,6 +110,12 @@ export class LibreFmService extends BaseService { ? parseInt(lastTrack.date.uts) : Math.floor(Date.now() / 1000); + const resolveField = (v: any, altKey = "name"): string => { + if (!v) return ""; + if (typeof v === "string") return v; + return v["#text"] ?? v[altKey] ?? ""; + }; + let duration: number | null = null; let endTime: number | null = null; @@ -119,7 +125,7 @@ export class LibreFmService extends BaseService { const trackInfoParams = new URLSearchParams({ method: "track.getInfo", track: lastTrack.name, - artist: lastTrack.artist.name, + artist: resolveField(lastTrack.artist), api_key: apiKey, format: "json", }); @@ -147,8 +153,8 @@ export class LibreFmService extends BaseService { const track: Track = { name: lastTrack.name, - artist: lastTrack.artist.name, - album: lastTrack.album["#text"], + artist: resolveField(lastTrack.artist), + album: resolveField(lastTrack.album, "title"), albumArt, url: lastTrack.url, date: lastTrack.date?.["#text"] ?? "now",