···11+<DetailsAdmo type="warning" summary="Insecure Communication">
22+33+This method of exposing Discord IPC is **not secure**. There is no authentication used for the traffic relayed to/from the opened TCP port.
44+55+You should only use this method if you trust the network your machine is on. Additionally:
66+77+* **Do** use a firewall to limit source (IP) of incoming traffic to this TCP port
88+* **Do not** expose this port to the public internet
99+1010+</DetailsAdmo>
···11+---
22+title: Discord (App)
33+toc_min_heading_level: 2
44+toc_max_heading_level: 5
55+---
66+77+import Tabs from '@theme/Tabs';
88+import TabItem from '@theme/TabItem';
99+import TcpWarning from "@site/src/components/snippets/_discord-port-warn.mdx";
1010+import JsonConfig from '!!raw-loader!@site/../config/discord-local.json.example';
1111+1212+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.
1313+1414+<img src={require('/img/discord_presence_art.png').default} height="127"/>
1515+1616+This integration uses an **existing Discord application** to set your Rich Presence.
1717+1818+## Required Setup
1919+2020+### Discord Application
2121+2222+You must create a [Discord App](https://docs.discord.com/developers/quick-start/overview-of-apps) in order to use this integration. Creating an App is free and simple.
2323+2424+Go to the [Discord Developer Portal](https://discord.com/developers/applications)
2525+2626+* Click on "New Application" and give it a name
2727+* Copy the **Application Id** (Client Id) shown after creation
2828+* Add this Id to your Multi-Scrobbler config
2929+ * Env Config => `DISCORD_APPLICATION_ID=12345678`
3030+ * File Config => `"applicationId": "12345678"`
3131+3232+### Discord Connection
3333+3434+This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either by being on the same machine or over a network.
3535+3636+:::note
3737+3838+If MS was [installed locally](/installation#local-installation) (not Docker) on the same machine as the Discord App then MS should [automatically detect the correct method](#find-ipc-connection) and [use it](#pass-ipc-to-multi-scrobbler) **without** any configuration from you. This will work for **any OS**.
3939+4040+If MS cannot determine this automatically, follow the steps for your OS below.
4141+4242+:::
4343+4444+Follow the sections below to configure MS for your specific environment.
4545+4646+#### Find IPC Connection
4747+4848+Discord uses OS-specific methods to communicate with other applications on the same host, called [IPC](https://en.wikipedia.org/wiki/Inter-process_communication). You may need to determine some details about the IPC method in order for MS to communicate with it correctly.
4949+5050+5151+<Tabs groupId="osType" queryString>
5252+5353+<TabItem value="linux" label="Discord on Linux">
5454+5555+On Linux, Discord uses a [Unix Socket](https://en.wikipedia.org/wiki/Unix_domain_socket) for IPC.
5656+5757+With Discord running, run this command:
5858+5959+```
6060+$ sudo netstat -apeen | grep discord
6161+6262+unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket
6363+unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0
6464+```
6565+6666+We see that the path we need is:
6767+6868+```
6969+/run/user/1000/discord-ipc-0
7070+```
7171+7272+</TabItem>
7373+7474+<TabItem value="macos" label="Discord on MacOS">
7575+7676+On MacOS, Discord uses a [Unix Socket](https://en.wikipedia.org/wiki/Unix_domain_socket) for IPC.
7777+7878+With Discord running, run this command:
7979+8080+```
8181+$ sudo netstat -apeen | grep discord
8282+8383+unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket
8484+unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0
8585+```
8686+8787+We see that the path we need is:
8888+8989+```
9090+/run/user/1000/discord-ipc-0
9191+```
9292+9393+</TabItem>
9494+9595+<TabItem value="windows" label="Discord on Windows">
9696+9797+Windows uses [**Named Pipes**](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes) for IPC. These aren't easily iteratable without external software, like [Pipetap](https://github.com/sensepost/pipetap).
9898+9999+The syntax for a named pipe is like this:
100100+101101+```
102102+\\.\pipe\app_named_pipe_foo
103103+```
104104+105105+and Discord's names follow this pattern:
106106+107107+```
108108+\\.\pipe\discord-ipc-0
109109+```
110110+111111+Where `0` increments for each different instance of Discord (official, canary, nightly, etc...).
112112+113113+The default Discord pipe name is: `discord-ipc-0`
114114+115115+</TabItem>
116116+117117+</Tabs>
118118+119119+#### Pass IPC to Multi-Scrobbler
120120+121121+After [finding your IPC connection path](#find-ipc-connection) you will need to make it accessible to Multi-Scrobbler.
122122+123123+<Tabs groupId="osType" queryString>
124124+125125+<TabItem value="linux" label="Discord on Linux">
126126+127127+ <Tabs groupId="msConnection">
128128+129129+ <TabItem value="remote" label="MS on Different Host">
130130+131131+ <TcpWarning/>
132132+133133+ Use [`socat`](https://linux.die.net/man/1/socat) to bidirectionally relay communication from Discord's [unix socket](#find-ipc-connection) to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login.
134134+135135+ ```shell
136136+ $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0
137137+ ```
138138+139139+ In your MS docker compose file add the `host:port` of the host running Discord/`socat` to `DISCORD_IPC_LOCATIONS` `environment:`
140140+141141+ ```yaml title="docker-compose.yaml"
142142+143143+ environment:
144144+ # ...
145145+ DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655
146146+ ```
147147+ </TabItem>
148148+ <TabItem value="local-docker" label="MS on Same Host (Docker)">
149149+150150+ In your MS docker compose file, pass the path of Discord's [unix socket](#find-ipc-connection) as a volume and add this path to `DISCORD_IPC_LOCATIONS` in `environment:`
151151+152152+ ```yaml title="docker-compose.yaml"
153153+154154+ environment:
155155+ # ...
156156+ DISCORD_IPC_LOCATIONS=/run/discord-ipc-0
157157+ volumes:
158158+ - /run/user/1000/discord-ipc-0:/run/discord-ipc-0
159159+ ```
160160+161161+ </TabItem>
162162+ <TabItem value="local" label="MS on Same Host (Non-Docker)">
163163+164164+ No configuration is required. If MS does not automatically work for you then try the **MS on Same Host (Docker)** method using the `DISCORD_IPC_LOCATIONS` environment variable.
165165+166166+ </TabItem>
167167+168168+ </Tabs>
169169+170170+</TabItem>
171171+172172+<TabItem value="macos" label="Discord on MacOS">
173173+174174+ <Tabs groupId="msConnection">
175175+176176+ <TabItem value="remote" label="MS on Different Host">
177177+178178+ <TcpWarning/>
179179+180180+ Use one of the methods below to setup `socat` on your macOS machine.
181181+182182+ <details>
183183+184184+ <summary>`socat` installed natively</summary>
185185+186186+ Install [`socat`](https://formulae.brew.sh/formula/socat) using homebrew to use it as a native command on your host.
187187+188188+ Then, use [`socat`](https://linux.die.net/man/1/socat) to bidirectionally relay communication from Discord's [unix socket](#find-ipc-connection) to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login.
189189+190190+ ```shell
191191+ $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0
192192+ ```
193193+194194+ </details>
195195+196196+ <details>
197197+198198+ <summary>`socat` in Docker</summary>
199199+200200+ Use the [`socat` container](https://hub.docker.com/r/alpine/socat) in combination with the Discord [unix socket](#find-ipc-connection) found earlier:
201201+202202+ ```yaml title="docker-compose.yaml"
203203+ services:
204204+ socat:
205205+ image: alpine/socat
206206+ ports:
207207+ - "6655:6655"
208208+ volumes:
209209+ - /run/user/1000/discord-ipc-0:/run/discord-ipc-0
210210+ command:
211211+ - '-v'
212212+ - 'TCP-LISTEN:6655,reuseaddr,fork'
213213+ - 'UNIX-CONNECT:/run/discord-ipc-0'
214214+ ```
215215+ </details>
216216+217217+ In your MS docker compose file add the `host:port` of the host running Discord/`socat` to `DISCORD_IPC_LOCATIONS` `environment:`
218218+219219+ ```yaml title="docker-compose.yaml"
220220+221221+ environment:
222222+ # ...
223223+ DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655
224224+ ```
225225+ </TabItem>
226226+ <TabItem value="local-docker" label="MS on Same Host (Docker)">
227227+228228+ In your MS docker compose file, pass the path of Discord's [unix socket](#find-ipc-connection) as a volume and add this path to `DISCORD_IPC_LOCATIONS` in `environment:`
229229+230230+ ```yaml title="docker-compose.yaml"
231231+232232+ environment:
233233+ # ...
234234+ DISCORD_IPC_LOCATIONS=/discord-ipc-0
235235+ volumes:
236236+ - /run/user/1000/discord-ipc-0:/run/discord-ipc-0
237237+ ```
238238+239239+ </TabItem>
240240+ <TabItem value="local" label="MS on Same Host (Non-Docker)">
241241+242242+ No configuration is required. If MS does not automatically work for you then try the **MS on Same Host (Docker)** method using the `DISCORD_IPC_LOCATIONS` environment variable.
243243+244244+ </TabItem>
245245+246246+ </Tabs>
247247+248248+</TabItem>
249249+250250+<TabItem value="windows" label="Discord on Windows">
251251+252252+ <Tabs groupId="msConnection">
253253+254254+ <TabItem value="remote" label="MS in Docker">
255255+256256+ :::note
257257+258258+ While it is possible to use [named pipes directly in Docker](https://forums.docker.com/t/volume-mount-path-error/143626/3) this has not been tested and [may only work for windows containers](https://github.com/docker/for-win/issues/6813#issuecomment-632859857). If you are adventurous, try this out and if you can get it working please [report your findings in an issue.](https://github.com/FoxxMD/multi-scrobbler/issues)
259259+260260+ :::
261261+262262+ :::warning
263263+264264+ This method is **experimental** and may be buggy and prone to crashes. If you are a Windows or Rust developer please consider helping improve the [pipe proxy implementation](https://github.com/FoxxMD/named-pipe-to-tcp-proxy).
265265+266266+ :::
267267+268268+ <TcpWarning/>
269269+270270+ Use [**pipeProxy**](https://github.com/FoxxMD/named-pipe-to-tcp-proxy) to connect to the Discord named pipe and expose it on a TCP port.
271271+272272+ Download the latest [`pipeProxy.exe`](https://github.com/FoxxMD/named-pipe-to-tcp-proxy/releases) from the releases page.
273273+274274+ The host/ip should be the IP of the machine running discord.
275275+276276+ Run pipeProxy from the windows command line:
277277+278278+ ```
279279+ pipeProxy.exe --pipe "\\.\pipe\discord-ipc-0" --tcp "192.168.0.100:6655"
280280+ ```
281281+282282+ In your MS docker compose file add the `host:port` of the host running `pipeProxy` to `DISCORD_IPC_LOCATIONS` `environment:`
283283+284284+ ```yaml title="docker-compose.yaml"
285285+286286+ environment:
287287+ # ...
288288+ DISCORD_IPC_LOCATIONS=192.168.0.100:6655
289289+ ```
290290+291291+ </TabItem>
292292+ <TabItem value="local" label="MS on Same Host (Non-Docker)">
293293+294294+ No configuration is required. If MS does not automatically work for you then try the **MS in Docker** method using the `DISCORD_IPC_LOCATIONS` environment variable.
295295+296296+ </TabItem>
297297+298298+ </Tabs>
299299+300300+</TabItem>
301301+</Tabs>
302302+303303+## Optional Setup
304304+305305+:::note
306306+307307+Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in [Headless](/configuration/discord/discord-headless#optional-setup) are not available for the Local integration.
308308+309309+:::
310310+311311+### Artwork
312312+313313+Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible.
314314+315315+The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below.
316316+317317+#### Artwork URL Types
318318+319319+<Tabs groupId="artworkUrl" queryString>
320320+<TabItem label="External URLs" value="external">
321321+MS can use external URLs for artwork.
322322+323323+<img src={require('/img/discord_presence_art.png').default} height="127"/>
324324+325325+External URLs that are not from known music services are **disabled by default.** This is to preserve *your* privacy because Discord does not host images, it only links to them and the URL is visible to other users.
326326+327327+<details>
328328+329329+<summary>Why Should I Care?</summary>
330330+331331+There are some scenarios where you may not want your artwork URLs to be visible, for example:
332332+333333+* A Source may be accessible only on your LAN (Jellyfin at `http://192.168.0.101`)
334334+* A Source may be internet-facing but you do not want to expose this information to discord/other users
335335+* A Source may be internet-facing but requires authentication to view the image
336336+</details>
337337+338338+MS will use your artwork URLs only if:
339339+340340+* artwork url is from a known music service/[Cover Art Archive](./?artworkUrl=caa#artwork-url-types) or
341341+* artwork url starts with `https` and
342342+ * `artwork` (`DISCORD_ARTWORK`) is
343343+ * `true` => always uses the url
344344+ * a list of custom domains keywords an external artwork url should contain EX
345345+ * ENV => `DISCORD_ARTWORK=mycdn,jellyfin`
346346+ * File Config => `"artwork": ["mycdn","jellyfin"]`
347347+348348+</TabItem>
349349+<TabItem label="Musicbrainz/Cover Art Achive" value="caa">
350350+MS can try to use [Cover Art Archive](http://coverartarchive.org/) to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you.
351351+352352+<img src={require('/img/discord_presence_art.png').default} height="127"/>
353353+354354+MS will try to use Cover Art Archive if:
355355+356356+* The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an [External URL](./?artworkUrl=external#artwork-url-types) condition
357357+* and **the scrobble data contains a [Musicbrainz](/configuration/transforms/musicbrainz) Release (Album) MBID**
358358+359359+Basically, if MS would normally use the [MS Default](./?artworkUrl=ms-default#artwork-url-types) art, it will first try to use Cover Art Archive if the scrobble has a Release MBID.
360360+361361+Some Source, like [Jellyfin](/configuration/sources/jellyfin) and [Plex](/configuration/sources/plex), can automatically provide this ID if the music is "matched" in your library.
362362+363363+For all others, you can [**configure MS to use the Musicbrainz Stage**](/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art) for Discord to try to get this MBID.
364364+</TabItem>
365365+<TabItem label="MS Default" value="ms-default">
366366+When these conditions are true:
367367+368368+* Cannot use an [External URL](./?artworkUrl=external#artwork-url-types) and
369369+* Cannot get album art from [Cover Art Archive](./?artworkUrl=caa#artwork-url-types) and
370370+* Play does not contain artwork information (no artwork shown in dashboard)
371371+372372+The status artwork will use a default URL instead of your artwork URL.
373373+374374+Without any other configuration, the default URL is an icon from the [multi-scrobbler repository](https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png):
375375+376376+<img src={require('/img/discord_presence_ms_default.png').default} height="127"/>
377377+378378+This default image can be customized:
379379+380380+* ENV Config => `DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png`
381381+* File Config => `"artworkDefaultUrl": "https://cooldomain.com/art.png"`
382382+383383+Remember, this URL need to be accessible on the public internet.
384384+</TabItem>
385385+</Tabs>
386386+387387+## Configuration
388388+389389+<Config config="DiscordClientConfig" fileContent={JsonConfig} client name="discord">
390390+ | Environmental Variable | Required? | Default | Description |
391391+ | :---------------------------- | --------- | ------- | :--------------------------------------------------------------------------------------------------------------- |
392392+ | `DISCORD_APPLICATION_ID` | Yes | | Application ID |
393393+ | `DISCORD_IPC_LOCATIONS` | No | | A commera-separated list of `host:port` network locations or file paths to unix socket for Discord |
394394+ | `DISCORD_ARTWORK` | No | | A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains |
395395+ | `DISCORD_ARTWORK_DEFAULT_URL` | No | | A URL of an image to use as a fallback if the album art URL cannot be used. Or `false` to use discord's default. |
396396+</Config>
···52525353You must provide a User Token for this scrobbler to work.
54545555-No instructions will be provided for obtaining a User Token because it is against Discord's policies to use it. Instead, you can search online for "how to obtain discord user token".
5656-5757-:::warning
5555+<DetailsAdmo type="warning" summary="User Token is a Sensitive Credential">
58565957Treat your User Token like a login credential. Anyone who has your token can access Discord as you.
60586159When finding instructions for obtaining this token only run commands, or follow steps, that you can understand and trust. Do not run commands you do not understand. Never give your token to someone else.
62606363-:::
6161+</DetailsAdmo>
6262+6363+No instructions will be provided for obtaining a User Token because it is against Discord's policies to use it. Instead, you can search online for "how to obtain discord user token".
64646565## Optional Setup
6666
···11----
22-title: Discord (Local)
33-toc_min_heading_level: 2
44-toc_max_heading_level: 5
55----
66-77-import Tabs from '@theme/Tabs';
88-import TabItem from '@theme/TabItem';
99-import JsonConfig from '!!raw-loader!@site/../config/discord-local.json.example';
1010-1111-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.
1212-1313-<img src={require('/img/discord_presence_art.png').default} height="127"/>
1414-1515-This integration uses an **existing Discord application** to set your Rich Presence.
1616-1717-## Required Setup
1818-1919-### Discord Application
2020-2121-You must create a [Discord App](https://docs.discord.com/developers/quick-start/overview-of-apps) in order to use this integration. Creating an App is free and simple.
2222-2323-Go to the [Discord Developer Portal](https://discord.com/developers/applications)
2424-2525-* Click on "New Application" and give it a name
2626-* Copy the **Application Id** (Client Id) shown after creation
2727-* Add this Id to your Multi-Scrobbler config
2828- * Env Config => `DISCORD_APPLICATION_ID=12345678`
2929- * File Config => `"applicationId": "12345678"`
3030-3131-### Discord Connection
3232-3333-This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either on the same machine or over a network.
3434-3535-<Tabs groupId="hostType" queryString>
3636-3737-<TabItem value="local" label="Local">
3838-3939-In this scenario you have Multi-Scrobbler running on the same machine as Discord.
4040-4141-<details>
4242-4343-<summary>Local (Non-Docker) Installation</summary>
4444-4545-If MS was [installed locally](/installation#local-installation) (not Docker) then MS should automatically detect Discord. This will work for **any OS**.
4646-4747-</details>
4848-4949-5050-<details>
5151-5252-<summary>Docker Installation</summary>
5353-5454-:::note
5555-5656-This works for **Linux/MacOS only.**
5757-5858-:::
5959-6060-If MS is in a docker container you need to find the location of **unix socket** for discord. This is normally named `discord-ipc-0`.
6161-6262-With Discord running, run this command:
6363-6464-```
6565-$ sudo netstat -apeen | grep discord
6666-6767-unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket
6868-unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0
6969-```
7070-7171-We see that the path we need is
7272-7373-```
7474-/run/user/1000/discord-ipc-0
7575-```
7676-7777-Pass this file into your docker container as a volume and add this path to `DISCORD_IPC_LOCATIONS` `environment:`
7878-7979-```yaml title="docker-compose.yaml"
8080-8181- environment:
8282- # ...
8383- DISCORD_IPC_LOCATIONS=/run/user/1000/discord-ipc-0
8484- volumes:
8585- - /run/user/1000/discord-ipc-0:/run/user/1000/discord-ipc-0
8686-```
8787-8888-</details>
8989-9090-</TabItem>
9191-<TabItem value="remove" label="Remote">
9292-9393-:::note
9494-9595-This works for **Linux/MacOS only.**
9696-9797-:::
9898-9999-100100-:::warning
101101-102102-This method is **insecure.** You should not expose this TCP port over a network unless access to the port is restricted and the network is trusted.
103103-104104-:::
105105-106106-On the machine Discord is running on you need to find the location of **unix socket** for discord. This is normally named `discord-ipc-0`.
107107-108108-With Discord running, run this command:
109109-110110-```
111111-$ sudo netstat -apeen | grep discord
112112-113113-unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket
114114-unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0
115115-```
116116-117117-We see that the path we need is
118118-119119-```
120120-/run/user/1000/discord-ipc-0
121121-```
122122-123123-Use [`socat`](https://linux.die.net/man/1/socat) to bidirectionally relay communication from Discord's unix socket to a listening TCP port. Likely, you will want to setup a service to start this command on login.
124124-125125-```shell
126126-$ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0
127127-```
128128-129129-Finally, in your MS docker compose file add the `host:port` of the host running Discord to `DISCORD_IPC_LOCATIONS` `environment:`
130130-131131-```yaml title="docker-compose.yaml"
132132-133133- environment:
134134- # ...
135135- DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655
136136-```
137137-138138-</TabItem>
139139-</Tabs>
140140-141141-## Optional Setup
142142-143143-:::note
144144-145145-Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in [Headless](/configuration/discord/discord-headless#optional-setup) are not available for the Local integration.
146146-147147-:::
148148-149149-### Artwork
150150-151151-Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible.
152152-153153-The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below.
154154-155155-#### Artwork URL Types
156156-157157-<Tabs groupId="artworkUrl" queryString>
158158-<TabItem label="External URLs" value="external">
159159-MS can use external URLs for artwork.
160160-161161-<img src={require('/img/discord_presence_art.png').default} height="127"/>
162162-163163-External URLs that are not from known music services are **disabled by default.** This is to preserve *your* privacy because Discord does not host images, it only links to them and the URL is visible to other users.
164164-165165-<details>
166166-167167-<summary>Why Should I Care?</summary>
168168-169169-There are some scenarios where you may not want your artwork URLs to be visible, for example:
170170-171171-* A Source may be accessible only on your LAN (Jellyfin at `http://192.168.0.101`)
172172-* A Source may be internet-facing but you do not want to expose this information to discord/other users
173173-* A Source may be internet-facing but requires authentication to view the image
174174-</details>
175175-176176-MS will use your artwork URLs only if:
177177-178178-* artwork url is from a known music service/[Cover Art Archive](./?artworkUrl=caa#artwork-url-types) or
179179-* artwork url starts with `https` and
180180- * `artwork` (`DISCORD_ARTWORK`) is
181181- * `true` => always uses the url
182182- * a list of custom domains keywords an external artwork url should contain EX
183183- * ENV => `DISCORD_ARTWORK=mycdn,jellyfin`
184184- * File Config => `"artwork": ["mycdn","jellyfin"]`
185185-186186-</TabItem>
187187-<TabItem label="Musicbrainz/Cover Art Achive" value="caa">
188188-MS can try to use [Cover Art Archive](http://coverartarchive.org/) to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you.
189189-190190-<img src={require('/img/discord_presence_art.png').default} height="127"/>
191191-192192-MS will try to use Cover Art Archive if:
193193-194194-* The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an [External URL](./?artworkUrl=external#artwork-url-types) condition
195195-* and **the scrobble data contains a [Musicbrainz](/configuration/transforms/musicbrainz) Release (Album) MBID**
196196-197197-Basically, if MS would normally use the [MS Default](./?artworkUrl=ms-default#artwork-url-types) art, it will first try to use Cover Art Archive if the scrobble has a Release MBID.
198198-199199-Some Source, like [Jellyfin](/configuration/sources/jellyfin) and [Plex](/configuration/sources/plex), can automatically provide this ID if the music is "matched" in your library.
200200-201201-For all others, you can [**configure MS to use the Musicbrainz Stage**](/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art) for Discord to try to get this MBID.
202202-</TabItem>
203203-<TabItem label="MS Default" value="ms-default">
204204-When these conditions are true:
205205-206206-* Cannot use an [External URL](./?artworkUrl=external#artwork-url-types) and
207207-* Cannot get album art from [Cover Art Archive](./?artworkUrl=caa#artwork-url-types) and
208208-* Play does not contain artwork information (no artwork shown in dashboard)
209209-210210-The status artwork will use a default URL instead of your artwork URL.
211211-212212-Without any other configuration, the default URL is an icon from the [multi-scrobbler repository](https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png):
213213-214214-<img src={require('/img/discord_presence_ms_default.png').default} height="127"/>
215215-216216-This default image can be customized:
217217-218218-* ENV Config => `DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png`
219219-* File Config => `"artworkDefaultUrl": "https://cooldomain.com/art.png"`
220220-221221-Remember, this URL need to be accessible on the public internet.
222222-</TabItem>
223223-</Tabs>
224224-225225-## Configuration
226226-227227-<Config config="DiscordClientConfig" fileContent={JsonConfig} client name="discord">
228228- | Environmental Variable | Required? | Default | Description |
229229- | :---------------------------- | --------- | ------- | :--------------------------------------------------------------------------------------------------------------- |
230230- | `DISCORD_APPLICATION_ID` | Yes | | Application ID |
231231- | `DISCORD_IPC_LOCATIONS` | No | | A commera-separated list of `host:port` network locations or file paths to unix socket for Discord |
232232- | `DISCORD_ARTWORK` | No | | A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains |
233233- | `DISCORD_ARTWORK_DEFAULT_URL` | No | | A URL of an image to use as a fallback if the album art URL cannot be used. Or `false` to use discord's default. |
234234-</Config>
···10101111There are two types of Discord integrations to choose from:
12121313-## Local
1313+## App
14141515-The **Local** integration uses an **existing** Discord application on Linux/MacOS to set Rich Presence.
1515+The **App** integration uses an **existing** Discord application on a desktop computer to set Rich Presence.
16161717* Uses "permitted" access to Discord, no TOS issues
1818* More restricted customization compared to Headless
1919* Only active when your existing Discord application is open
2020-* For scenarios where Multi-Scrobbler is not on the same machine as Discord
2121- * Requires an additional program to relay the Discord connection
2020+* For more scenarios it requires additional, OS-specific steps to setup correctly
2121+ * May require an additional program on your machine to relay the Discord connection
2222 * This is potentially insecure, or less secure, then Headless
23232424-[**Local Docs**](/configuration/clients/discord/discord-local)
2424+[**App Docs**](/configuration/clients/discord/discord-app)
25252626## Headless
2727···29293030* Does not require an existing Discord application (uses Discord cloud API)
3131* Using this **Violates Discord TOS** because it requires a user token
3232-* More customization than Local
3232+* More customization than App integration
3333* Active if **any** Discord application is online
34343535[**Headless Docs**](/configuration/clients/discord/discord-headless)