[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

feat(lastfm): Add response content logging #449

FoxxMD (Jan 20, 2026, 3:53 PM UTC) 5b6ad26b 59a132e5

+155 -2
+116
patches/lastfm-ts-api+2.3.0.patch
··· 1 + diff --git a/node_modules/lastfm-ts-api/dist/api-request.d.ts b/node_modules/lastfm-ts-api/dist/api-request.d.ts 2 + index 81229b1..237c488 100644 3 + --- a/node_modules/lastfm-ts-api/dist/api-request.d.ts 4 + +++ b/node_modules/lastfm-ts-api/dist/api-request.d.ts 5 + @@ -1,4 +1,5 @@ 6 + import { LastFMParams, LastFMUnknownFunction, OptionalConfig } from './types.js'; 7 + +import { IncomingMessage } from 'node:http'; 8 + export declare class LastFMApiRequest<T> { 9 + config: OptionalConfig; 10 + private readonly params; 11 + @@ -11,4 +12,12 @@ export declare class LastFMApiRequest<T> { 12 + private getMethod; 13 + private getOptions; 14 + } 15 + +export declare class LastFMResponseError extends Error { 16 + + response?: IncomingMessage; 17 + + content?: string; 18 + + constructor(message: string, options?: ErrorOptions & { 19 + + response?: IncomingMessage; 20 + + content?: string; 21 + + }); 22 + +} 23 + export default LastFMApiRequest; 24 + diff --git a/node_modules/lastfm-ts-api/dist/api-request.js b/node_modules/lastfm-ts-api/dist/api-request.js 25 + index b65e770..8e708cb 100644 26 + --- a/node_modules/lastfm-ts-api/dist/api-request.js 27 + +++ b/node_modules/lastfm-ts-api/dist/api-request.js 28 + @@ -55,7 +55,7 @@ export class LastFMApiRequest { 29 + let data = ''; 30 + httpResponse.setEncoding('utf8'); 31 + httpResponse.on('data', chunk => (data += chunk)); 32 + - httpResponse.on('end', () => resolve(data)); 33 + + httpResponse.on('end', () => resolve([httpResponse, data])); 34 + httpResponse.on('error', err => reject(err)); 35 + }); 36 + httpRequest.on('error', err => reject(err)); 37 + @@ -63,13 +63,16 @@ export class LastFMApiRequest { 38 + httpRequest.write(paramsStr); 39 + } 40 + httpRequest.end(); 41 + - }).then((response) => { 42 + + }).then(([response, content]) => { 43 + + if (response.headers['content-type'] !== 'application/json') { 44 + + throw new LastFMResponseError(`lastfm-ts-api: Expected JSON response but received '${response.headers['content-type']}'`, { response, content }); 45 + + } 46 + let data; 47 + try { 48 + - data = JSON.parse(response); 49 + + data = JSON.parse(content); 50 + } 51 + catch (err) { 52 + - throw new Error(`lastfm-ts-api: Unable to parse LastFM API response to JSON. API response is ${err}`); 53 + + throw new LastFMResponseError(`lastfm-ts-api: Unable to parse LastFM API response to JSON.`, { cause: err, response, content }); 54 + } 55 + if (data?.error) { 56 + let msg = 'LastFM API returned an error.'; 57 + @@ -80,7 +83,7 @@ export class LastFMApiRequest { 58 + else if (data?.message !== undefined) { 59 + msg = data.message; 60 + } 61 + - throw new Error(`lastfm-ts-api: ${msg}`); 62 + + throw new LastFMResponseError(`lastfm-ts-api: ${msg}`, { response, content }); 63 + } 64 + return data; 65 + }); 66 + @@ -115,6 +118,9 @@ export class LastFMApiRequest { 67 + hostname: this.config.hostname ?? 'ws.audioscrobbler.com', 68 + path: this.config.path ?? '/2.0' 69 + }; 70 + + if (this.config.timeout !== undefined) { 71 + + options.signal = AbortSignal.timeout(this.config.timeout); 72 + + } 73 + if (method === 'POST') { 74 + options.method = 'POST'; 75 + options.headers = { 76 + @@ -128,5 +134,16 @@ export class LastFMApiRequest { 77 + return options; 78 + } 79 + } 80 + +export class LastFMResponseError extends Error { 81 + + response; 82 + + content; 83 + + constructor(message, options) { 84 + + super(message, options); 85 + + this.name = 'LastFMResponseError'; 86 + + const { content, response } = options ?? {}; 87 + + this.response = response; 88 + + this.content = content; 89 + + } 90 + +} 91 + export default LastFMApiRequest; 92 + //# sourceMappingURL=api-request.js.map 93 + \ No newline at end of file 94 + diff --git a/node_modules/lastfm-ts-api/dist/api-request.js.map b/node_modules/lastfm-ts-api/dist/api-request.js.map 95 + index 389f888..d5cf276 100644 96 + --- a/node_modules/lastfm-ts-api/dist/api-request.js.map 97 + +++ b/node_modules/lastfm-ts-api/dist/api-request.js.map 98 + @@ -1 +1 @@ 99 + -{"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"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"} 100 + \ No newline at end of file 101 + +{"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"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"} 102 + \ No newline at end of file 103 + diff --git a/node_modules/lastfm-ts-api/dist/types.d.ts b/node_modules/lastfm-ts-api/dist/types.d.ts 104 + index e79dd90..1394497 100644 105 + --- a/node_modules/lastfm-ts-api/dist/types.d.ts 106 + +++ b/node_modules/lastfm-ts-api/dist/types.d.ts 107 + @@ -1292,6 +1292,7 @@ export type LastFMUserGetWeeklyTrackChartResponse = Readonly<{ 108 + }; 109 + }>; 110 + export type OptionalConfig = { 111 + - hostname: string; 112 + - path: string; 113 + + hostname?: string; 114 + + path?: string; 115 + + timeout?: number; 116 + };
+8
src/backend/common/vendor/LastfmApiClient.ts
··· 13 13 import { parseArtistCredits } from "../../utils/StringUtils.js"; 14 14 import { LastFMUser, LastFMAuth, LastFMTrack, LastFMUserGetRecentTracksResponse, LastFMBooleanNumber, LastFMUpdateNowPlayingResponse, LastFMUserGetInfoResponse } from 'lastfm-ts-api'; 15 15 import clone from 'clone'; 16 + import { IncomingMessage } from "http"; 16 17 17 18 const badErrors = [ 18 19 'api key suspended', ··· 98 99 const { 99 100 message, 100 101 } = e; 102 + if('content' in e) { 103 + let msg = 'Raw Response'; 104 + if('response' in e) { 105 + msg = `(${(e.response as IncomingMessage).statusCode}) ${msg}`; 106 + } 107 + this.logger.error(`${msg}:\n${e.content}`); 108 + } 101 109 // for now check for exceptional errors by matching error code text 102 110 const retryError = retryErrors.find(x => message.toLocaleLowerCase().includes(x)); 103 111 let networkError = undefined;
+31 -2
src/backend/tests/lastfm/lastfm.test.ts
··· 3 3 import { after, before, describe, it } from 'mocha'; 4 4 import { generateLastfmTrackObject, generateMbid, generatePlay } from "../utils/PlayTestUtils.js"; 5 5 6 - import { playToClientPayload, formatPlayObj } from '../../common/vendor/LastfmApiClient.js'; 6 + import LastfmApiClient, { playToClientPayload, formatPlayObj } from '../../common/vendor/LastfmApiClient.js'; 7 + import { MockNetworkError, withRequestInterception } from '../utils/networking.js'; 8 + import { http, HttpResponse, delay } from "msw"; 9 + import { loggerDebug } from '@foxxmd/logging'; 10 + import { configDir, projectDir } from '../../common/index.js'; 11 + import { LastFMGeo } from 'lastfm-ts-api'; 7 12 8 13 chai.use(asPromised); 9 14 ··· 63 68 expect(formatPlayObj(toArtName).data.artists[0]).to.eq(toArtName.artist.name); 64 69 }); 65 70 66 - }); 71 + }); 72 + 73 + // it('should catch error and log contents on api failure', async function () { 74 + // this.timeout(50000); 75 + // await withRequestInterception([ 76 + // http.post('ws.audioscrobbler.com/2.0', async () => { 77 + // return HttpResponse.html('<html>This is a test</html>', {status: 200}); 78 + // }) 79 + // ], async function () { 80 + 81 + // const lfm = new LastfmApiClient('mylfm-client-test', { 82 + // apiKey: '', 83 + // secret: '' 84 + // }, { 85 + // logger: loggerDebug, 86 + // localUrl: new URL('http://localhost:9078'), 87 + // configDir: configDir, 88 + // version: 'test' 89 + // }); 90 + 91 + // await lfm.initialize(); 92 + 93 + // await lfm.testAuth(); 94 + // })(); 95 + // });