From 4ca1923f15188846eabee68704a02c4e32c3a275 Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Sun, 25 Jan 2026 11:45:23 +0100 Subject: [PATCH] fix(lastfm): format multiple artists with ampersands for scrobbling --- js/lastfm.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/js/lastfm.js b/js/lastfm.js index 45a13bf..ab118e4 100644 --- a/js/lastfm.js +++ b/js/lastfm.js @@ -50,6 +50,21 @@ export class LastFMScrobbler { return !!this.sessionKey; } + _getScrobbleArtist(track) { + if (!track) return 'Unknown Artist'; + let artistName = 'Unknown Artist'; + + if (track.artists && track.artists.length > 0) { + artistName = track.artists.map((a) => (typeof a === 'string' ? a : a.name || a)).join(', '); + } else { + artistName = track.artist?.name || track.artist || 'Unknown Artist'; + } + + if (typeof artistName !== 'string') artistName = 'Unknown Artist'; + + return artistName.replace(/, /g, ' & '); + } + async generateSignature(params) { const filteredParams = { ...params }; delete filteredParams.format; @@ -154,7 +169,7 @@ export class LastFMScrobbler { try { const params = { - artist: track.artists?.[0]?.name || track.artist?.name || 'Unknown Artist', + artist: this._getScrobbleArtist(track), track: track.title, }; @@ -203,7 +218,7 @@ export class LastFMScrobbler { const timestamp = Math.floor(Date.now() / 1000); const params = { - artist: this.currentTrack.artists?.[0]?.name || this.currentTrack.artist?.name || 'Unknown Artist', + artist: this._getScrobbleArtist(this.currentTrack), track: this.currentTrack.title, timestamp: timestamp, }; @@ -234,7 +249,7 @@ export class LastFMScrobbler { try { const params = { - artist: track.artists?.[0]?.name || track.artist?.name || 'Unknown Artist', + artist: this._getScrobbleArtist(track), track: track.title, };