[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: Enrich listenbrainz and jellyfin source plays with artist mbids

FoxxMD (May 7, 2026, 2:42 AM UTC) d95f323d 1b53d22e

+24 -5
+14 -2
src/backend/common/vendor/ListenbrainzApiClient.ts
··· 548 548 ...naivePlay, 549 549 data: { 550 550 ...naivePlay.data, 551 - artists: artistNamesToCredits(derivedArtists) 551 + artists: derivedArtists.map(x => { 552 + const mappedArtist = artistMappings.find(y => y.artist_credit_name === x); 553 + if(mappedArtist !== undefined) { 554 + return {name: mappedArtist.artist_credit_name, mbid: mappedArtist.artist_mbid} 555 + } 556 + return {name: x}; 557 + }) 552 558 } 553 559 }; 554 560 } ··· 579 585 data: { 580 586 ...naivePlay.data, 581 587 track: normalTrackName, 582 - artists: artistNamesToCredits(derivedArtists) 588 + artists: derivedArtists.map(x => { 589 + const mappedArtist = artistMappings.find(y => y.artist_credit_name === x); 590 + if(mappedArtist !== undefined) { 591 + return {name: mappedArtist.artist_credit_name, mbid: mappedArtist.artist_mbid} 592 + } 593 + return {name: x}; 594 + }) 583 595 }, 584 596 meta: naivePlay.meta 585 597 }
+10 -3
src/backend/sources/JellyfinApiSource.ts
··· 42 42 from "@jellyfin/sdk/lib/index.js"; 43 43 import dayjs from "dayjs"; 44 44 import EventEmitter from "events"; 45 - import { BrainzMeta, PlayObject, PlayObjectLifecycleless } from "../../core/Atomic.js"; 46 - import { buildTrackString, combinePartsToString, truncateStringToLength } from "../../core/StringUtils.js"; 45 + import { ArtistCredit, BrainzMeta, PlayObject, PlayObjectLifecycleless } from "../../core/Atomic.js"; 46 + import { artistNamesToCredits, buildTrackString, combinePartsToString, truncateStringToLength } from "../../core/StringUtils.js"; 47 47 import { 48 48 FormatPlayObjectOptions, 49 49 InternalConfig, ··· 466 466 meta.albumArtist = [ProviderIds.MusicBrainzAlbumArtist]; 467 467 } 468 468 469 + let playArtists: ArtistCredit[] = []; 470 + if(Artists.length === 1 && meta.artist !== undefined) { 471 + playArtists.push({name: Artists[0], mbid: meta.artist[0]}); 472 + } else { 473 + playArtists = artistNamesToCredits(Artists); 474 + } 475 + 469 476 const play: PlayObjectLifecycleless = { 470 477 data: { 471 - artists: Artists, 478 + artists: playArtists, 472 479 album: Album, 473 480 track: Name, 474 481 albumArtists: AlbumArtists !== undefined ? AlbumArtists.map(x => x.Name) : undefined,