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.
This commit is contained in:
kmmiio99o 2026-07-02 14:13:34 +02:00
parent 400398829e
commit 28958a79af
No known key found for this signature in database
GPG key ID: AC9D7747D423B9BF
2 changed files with 18 additions and 6 deletions

View file

@ -107,6 +107,12 @@ export class LastFmService extends BaseService {
? parseInt(lastTrack.date.uts) ? parseInt(lastTrack.date.uts)
: Math.floor(Date.now() / 1000); : 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 duration: number | null = null;
let endTime: number | null = null; let endTime: number | null = null;
@ -116,7 +122,7 @@ export class LastFmService extends BaseService {
const trackInfoParams = new URLSearchParams({ const trackInfoParams = new URLSearchParams({
method: "track.getInfo", method: "track.getInfo",
track: lastTrack.name, track: lastTrack.name,
artist: lastTrack.artist.name, artist: resolveField(lastTrack.artist),
api_key: currentSettings.apiKey, api_key: currentSettings.apiKey,
format: "json", format: "json",
}); });
@ -144,8 +150,8 @@ export class LastFmService extends BaseService {
const track: Track = { const track: Track = {
name: lastTrack.name, name: lastTrack.name,
artist: lastTrack.artist.name, artist: resolveField(lastTrack.artist),
album: lastTrack.album["#text"], album: resolveField(lastTrack.album, "title"),
albumArt, albumArt,
url: lastTrack.url, url: lastTrack.url,
date: lastTrack.date?.["#text"] ?? "now", date: lastTrack.date?.["#text"] ?? "now",

View file

@ -110,6 +110,12 @@ export class LibreFmService extends BaseService {
? parseInt(lastTrack.date.uts) ? parseInt(lastTrack.date.uts)
: Math.floor(Date.now() / 1000); : 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 duration: number | null = null;
let endTime: number | null = null; let endTime: number | null = null;
@ -119,7 +125,7 @@ export class LibreFmService extends BaseService {
const trackInfoParams = new URLSearchParams({ const trackInfoParams = new URLSearchParams({
method: "track.getInfo", method: "track.getInfo",
track: lastTrack.name, track: lastTrack.name,
artist: lastTrack.artist.name, artist: resolveField(lastTrack.artist),
api_key: apiKey, api_key: apiKey,
format: "json", format: "json",
}); });
@ -147,8 +153,8 @@ export class LibreFmService extends BaseService {
const track: Track = { const track: Track = {
name: lastTrack.name, name: lastTrack.name,
artist: lastTrack.artist.name, artist: resolveField(lastTrack.artist),
album: lastTrack.album["#text"], album: resolveField(lastTrack.album, "title"),
albumArt, albumArt,
url: lastTrack.url, url: lastTrack.url,
date: lastTrack.date?.["#text"] ?? "now", date: lastTrack.date?.["#text"] ?? "now",