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:
parent
400398829e
commit
28958a79af
2 changed files with 18 additions and 6 deletions
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue