[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.

refactor(discord): Update links and art

* Use pocike icon for placeholder art
* Use MS logo for small art with link to docs
* Use web link as track url, if available
* Use MB link as track or artist url

FoxxMD (Feb 17, 2026, 9:05 PM UTC) 2a2fb9ad ea5b66cd

+19 -19
+1
assets/README.md
··· 1 + * Attribution for [`default-artwork.png`](/assets/default-artwork.png): https://www.flaticon.com/free-icon/music_15795471
assets/default-artwork.png

This is a binary file and will not be displayed.

+3 -3
docsite/docs/configuration/clients/discord.mdx
··· 11 11 12 12 This scrobbler uses **[Now Playing](/configuration/clients#now-playing)** functionality to set your Discord [Rich Presence](https://docs.discord.com/developers/rich-presence/overview) to the music you are currently monitoring with multi-scrobbler. 13 13 14 - <img src={require('/img/discord_presence.png').default} height="131"/> 14 + <img src={require('/img/discord_presence_art.png').default} height="127"/> 15 15 16 16 :::warning[Discord TOS Violation] 17 17 ··· 257 257 <TabItem label="Discord Default" value="discord-default"> 258 258 When [**Application Id**](#discord-application) is **not** configured Discord will show its own default image. 259 259 260 - <img src={require('/img/discord_presence_default.png').default} height="127"/> 260 + <img src={require('/img/discord_presence_discord_default.png').default} height="127"/> 261 261 </TabItem> 262 262 <TabItem label="MS Default" value="ms-default"> 263 263 When [**Application Id**](#discord-application) **is** configured and any of these conditions is true: ··· 272 272 273 273 Without any other configuration, the default URL is for the the MS logo: 274 274 275 - <img src={require('/img/discord_presence.png').default} height="131"/> 275 + <img src={require('/img/discord_presence_ms_default.png').default} height="127"/> 276 276 277 277 This default image can be customized: 278 278
docsite/static/img/discord_presence_art.png

This is a binary file and will not be displayed.

docsite/static/img/discord_presence_default.png docsite/static/img/discord_presence_discord_default.png
docsite/static/img/discord_presence_ms_default.png

This is a binary file and will not be displayed.

+15 -16
src/backend/common/vendor/discord/DiscordWSClient.ts
··· 19 19 import { urlToMusicService } from "../ListenbrainzApiClient.js"; 20 20 import { fa } from "@faker-js/faker"; 21 21 22 - const ARTWORK_PLACEHOLDER = 'https://raw.githubusercontent.com/FoxxMD/multi-scrobbler/master/assets/icon.png'; 23 - const MB_ART = 'https://raw.githubusercontent.com/FoxxMD/multi-scrobbler/master/assets/musicbrainz-logo-small.png'; 22 + const ARTWORK_PLACEHOLDER = 'https://raw.githubusercontent.com/FoxxMD/multi-scrobbler/master/assets/default-artwork.png'; 23 + const MS_ART = 'https://raw.githubusercontent.com/FoxxMD/multi-scrobbler/master/assets/icon.png'; 24 24 const API_GATEWAY_ENDPOINT = 'https://discord.com/api/gateway'; 25 25 26 26 /** ··· 432 432 artwork = false 433 433 } = this.config; 434 434 const { 435 - artworkDefaultUrl = ARTWORK_PLACEHOLDER 435 + artworkDefaultUrl = ARTWORK_PLACEHOLDER, 436 + applicationId 436 437 } = this.config; 437 438 438 439 let art = artworkDefaultUrl; ··· 458 459 if(usedUrl !== undefined) { 459 460 activity.assets.large_image = usedUrl; 460 461 } 461 - if(activity.assets.small_text !== undefined) { 462 - const smallArt = await this.getArtworkUrl(MB_ART); 463 - if(smallArt !== undefined) { 462 + } 463 + if(art !== MS_ART && applicationId !== undefined) { 464 + const smallArt = await this.getArtworkUrl(MS_ART); 465 + if(smallArt !== undefined) { 464 466 activity.assets.small_image = smallArt; 465 - } else { 466 - delete activity.assets.small_text; 467 - delete activity.assets.small_url; 468 - } 469 - } 467 + activity.assets.small_text = 'Via Multi-Scrobbler' 468 + activity.assets.small_url = 'https://multi-scrobbler.app' 469 + } 470 470 } 471 471 472 472 return activity; ··· 738 738 if(url !== undefined) { 739 739 const knownService = urlToMusicService(url); 740 740 if(knownService !== undefined) { 741 - activity.assets.large_url = url; 741 + activity.details_url = url; 742 742 743 743 // when including buttons discord accepts the presence update but does not actually use it 744 744 // I think buttons may now be limited to official RPC or restricted to preset actions via things like secrets or registering commands ··· 752 752 } 753 753 if(recording !== undefined) { 754 754 const mb = `https://musicbrainz.org/recording/${recording}`; 755 - if(activity.assets.large_url === undefined) { 756 - activity.assets.large_url = mb; 755 + if(activity.details_url === undefined) { 756 + activity.details_url = mb; 757 757 } else { 758 - activity.assets.small_url = mb; 759 - activity.assets.small_text = 'Open On Musicbrainz'; 758 + activity.state_url = mb; 760 759 } 761 760 // buttons.push({ 762 761 // label: 'Open on Musicbrainz',