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

docs: Use AdmonitionDetails

FoxxMD (Jan 13, 2026, 8:35 PM UTC) c0c449ec 4f9cfcf4

+51 -42
+4 -4
docsite/docs/configuration/clients/rocksky.mdx
··· 23 23 24 24 </details> 25 25 26 - :::warning[Public Data] 26 + <DetailsAdmo type="warning" summary="Your Data Is Public"> 27 27 28 28 The default Bluesky PDS is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. 29 29 30 - ::: 30 + </DetailsAdmo> 31 31 32 - :::warning[No Scrobbling Guarantee] 32 + <DetailsAdmo type="warning" summary="No Scrobbling Guarantee"> 33 33 34 34 Rocksky **does not guarantee** that every scrobble you send will be persisted. Rocksky's design goal is to store scrobbles with **metdata-complete, 3rd party verifiable track information** so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth. 35 35 ··· 37 37 38 38 If you need your scrobbles to be 100% captured then you should scrobble to an *additional* [Scrobble Client](/configuration/clients). 39 39 40 - ::: 40 + </DetailsAdmo> 41 41 42 42 ## Setup 43 43
+4 -4
docsite/docs/configuration/clients/tealfm.mdx
··· 26 26 27 27 </details> 28 28 29 - :::warning 29 + <DetailsAdmo type="warning" summary="Your Data Is Public"> 30 30 31 31 The default Bluesky PDS is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. 32 32 33 - ::: 33 + </DetailsAdmo> 34 34 35 - :::note 35 + <DetailsAdmo type="note" summary="teal.fm Is Still In Development"> 36 36 37 37 [teal.fm is still in developement](https://notes.teal.fm/3lzlwe6puis2l) and does not have a public website, yet. 38 38 ··· 42 42 * use [teal-slice.wisp.place](https://tealfm-slice.wisp.place/) for a preview of teal.fm 43 43 * use [atproto.at](https://atproto.at) to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this) 44 44 45 - ::: 45 + </DetailsAdmo> 46 46 47 47 ## Setup 48 48
+1 -7
docsite/docs/configuration/sources/azuracast.mdx
··· 8 8 import TabItem from '@theme/TabItem'; 9 9 import CodeBlock from '@theme/CodeBlock'; 10 10 import AzuracastConfig from '!!raw-loader!@site/../config/azuracast.json.example'; 11 - import ShouldScrobble from "@site/src/components/snippets/_should-scrobble.mdx" 11 + import ShouldScrobble from "@site/src/components/snippets/_should-scrobble-details.mdx" 12 12 13 13 :::tip[Scrobbling Threshold] 14 14 ··· 36 36 'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws 37 37 ``` 38 38 39 - #### Scrobble Behavior 40 - 41 - :::info 42 - 43 39 <ShouldScrobble filename="azuracast"/> 44 - 45 - ::: 46 40 47 41 Multi-scrobbler will set the default **scrobbling behavior** based on if either of these settings is configured: 48 42
+3 -7
docsite/docs/configuration/sources/icecast.mdx
··· 8 8 import TabItem from '@theme/TabItem'; 9 9 import CodeBlock from '@theme/CodeBlock'; 10 10 import IcecastConfig from '!!raw-loader!@site/../config/icecast.json.example'; 11 - import ShouldScrobble from "@site/src/components/snippets/_should-scrobble.mdx" 11 + import ShouldScrobble from "@site/src/components/snippets/_should-scrobble-details.mdx" 12 12 13 13 Parse metadata from any Icecast Station (streams) to use for scrobbling. 14 14 ··· 20 20 21 21 ::: 22 22 23 - :::note[Scrobbling Behavior] 24 - 25 - Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, **automatic scrobbling for Icecast Sources is off by default.** 26 - 27 - Use [Should Scrobble Behavior](/configuration/sources#should-scrobble-behavior) to initiate scrobbling or configure automatic scrobble. 23 + Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, **automatic scrobbling for Icecast Sources is off by default.** Use **Should Scrobble Behavior** to initiate scrobbling or configure automatic scrobble. 28 24 29 - ::: 25 + <ShouldScrobble filename="icecast"/> 30 26 31 27 :::tip[Scrobbling Threshold] 32 28
+2 -2
docsite/docs/configuration/sources/jellyfin.mdx
··· 19 19 20 20 It is **recommended** to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and **password.** 21 21 22 - :::tip[Important Defaults] 22 + <DetailsAdmo type="tip" summary="Important Defaults"> 23 23 24 24 By default... 25 25 ··· 31 31 * multi-scrobbler will **only** scrobble media Jellyfin detects as **Audio.** 32 32 * To force multi-scrobbler to scrobble when media is detected as **Unknown** use `"allowUnknown": true` in file/aio configuration. 33 33 34 - ::: 34 + </DetailsAdmo> 35 35 36 36 #### Configuration 37 37
+3 -6
docsite/docs/configuration/sources/spotify.mdx
··· 8 8 import TabItem from '@theme/TabItem'; 9 9 import CodeBlock from '@theme/CodeBlock'; 10 10 import SpotifyConfig from '!!raw-loader!@site/../config/spotify.json.example'; 11 + import IconWarning from '@theme/Admonition/Icon/Warning'; 11 12 12 - <details> 13 - 14 - <summary>Spotify and Automix</summary> 15 - 13 + <DetailsAdmo type="note" summary="Spotify and Automix"> 16 14 If your Spotify player has [Automix](https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278) enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is "mixed" in your queue with a shorter play time than its actual length and [Spotify does not report this modified play time in its API.](https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147) This **does not affect MS's ability to scrobble** from Spotify but it will affect the accuracy of the duration MS reports was played. 17 - 18 - </details> 15 + </DetailsAdmo> 19 16 20 17 #### Authenticate Spotify with Multi-Scrobbler 21 18
+4 -4
docsite/docs/configuration/sources/subsonic.mdx
··· 11 11 12 12 This Source can be used for any application that implements the [Subsonic API](http://www.subsonic.org/pages/api.jsp) and supports the [`getNowPlaying`](http://www.subsonic.org/pages/api.jsp#getNowPlaying) endpoint (such as [Airsonic](https://airsonic.github.io/) and [Navidrome](https://www.navidrome.org/)) 13 13 14 - :::warning[Known Issues] 14 + <DetailsAdmo type="warning" summary="Known Issues"> 15 15 16 16 * Multiple artists are reported as one value and cannot be separated 17 17 * If using [Airsonic Advanced](https://github.com/airsonic-advanced/airsonic-advanced) the password used (under **Credentials**) must be **Decodable** 18 18 19 - ::: 19 + </DetailsAdmo> 20 20 21 - :::tip 21 + <DetailsAdmo type="tip" summary="Recommended Alternative Sources"> 22 22 23 23 If your serivce supports scrobbling to **Listenbrainz** (such as Navidrome), considering using a [**Listenbrainz (Endpoint)** Source](/configuration/sources/listenbrainz-endpoint) instead of this one. 24 24 25 25 Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API. 26 26 27 - ::: 27 + </DetailsAdmo> 28 28 29 29 Use the optional `usersAllow` property with **File** or **AIO** configuration to restrict scrobbling to a list of defined users. 30 30
+12
docsite/docs/configuration/sources/vlc.mdx
··· 42 42 43 43 To extract this information use [named capture groups](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Named_capturing_group) in your expression matching the field that should be extracted: `artist` `title` and/or `album`. MS accepts multiple expressions, the first one that matches a filename will be used. 44 44 45 + <details> 46 + 47 + <summary>Example</summary> 48 + 45 49 Example usage in [a file-based config:](/configuration?configType=file#configuration-types) 46 50 47 51 ```json5 title="config/vlc.json" {10-15} ··· 64 68 } 65 69 ] 66 70 ``` 71 + 72 + </details> 67 73 68 74 #### Vlc Information Reporting 69 75 70 76 If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the _name_ of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on: 71 77 78 + <details> 79 + 80 + <summary>Metadata Logging Configuration</summary> 81 + 72 82 ```json5 title="config/vlc.json" {9-9} 73 83 [ 74 84 { ··· 83 93 } 84 94 ] 85 95 ``` 96 + 97 + </details> 86 98 87 99 ## Configuration 88 100
+4 -4
docsite/docs/configuration/sources/webscrobbler.mdx
··· 18 18 19 19 Reload the extension after adding the webhook. 20 20 21 - :::note 21 + <DetailsAdmo type="note" summary="URL Types Supported by Webscrobbler"> 22 22 23 23 * **On Firefox** - Only FQNs (domain.tld), `localhost`, and `127.0.0.1` are supported for API URL due to [firefox requiring https](https://github.com/web-scrobbler/web-scrobbler/issues/4183#issuecomment-1749222006) 24 24 * **On Chromium-based Browsers** - Any domain will work for API URL 25 25 * All other browsers are untested 26 26 27 - ::: 27 + </DetailsAdmo> 28 28 29 - :::warning 29 + <DetailsAdmo type="warning" summary="Public-Facing Usage"> 30 30 31 31 Multi-scrobbler is **not** designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended). 32 32 33 - ::: 33 + </DetailsAdmo> 34 34 35 35 ### Multiple Users 36 36
+2 -2
docsite/docs/configuration/transforms/musicbrainz.mdx
··· 848 848 849 849 Use field-based methods if your Sources do not return IDs consistently (or at all). Add more field-based methods the more inaccurate your scrobble data may be, but be aware that more aggressive/broad searches may return less accurate results. 850 850 851 - :::tip[Lastfm] 851 + <DetailsAdmo type="tip" summary="Matching Scrobbles from Last.fm"> 852 852 853 853 Last.fm is inconsistent when it comes to matching your scrobbles. It will accept (almost) any fields for track/title/album and aggressively attempt to match/correct these, regardless of your intentions. 854 854 ··· 856 856 857 857 Therefore, you should *avoid* using `mbidRecording` and `basicOrIds` as the primary search methods (or understand the risks of using them). Instead, prefer to use field-based methods *before* falling back to id-based methods. 858 858 859 - ::: 859 + </DetailsAdmo> 860 860 861 861 ### Filter Considerations 862 862
+3 -2
docsite/docs/configuration/transforms/transforms.mdx
··· 84 84 * `compare` - temporarily modify Play data when it is being compared to see if it was already scrobbled 85 85 * `postCompare` - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles 86 86 87 - :::tip 87 + <DetailsAdmo type="tip" summary="Transformed Scrobbles Are Permanently Modified"> 88 88 89 89 Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the **compare** hook). 90 90 91 91 For example, to modify the track so it's the same anywhere it is processed in multi-scrobbler you only need to modify it in the **Source's** `preCompare` hook because all later processes will receive the data with the modified track. 92 92 93 - ::: 93 + 94 + </DetailsAdmo> 94 95 95 96 :::tip[TLDR] 96 97
+5
docsite/src/components/snippets/_should-scrobble-details.mdx
··· 1 + import ShouldScrobble from "@site/src/components/snippets/_should-scrobble.mdx" 2 + 3 + <DetailsAdmo type="note" summary="Should Scrobble Behavior"> 4 + <ShouldScrobble {...props}/> 5 + </DetailsAdmo>
+4
docsite/src/css/custom.css
··· 59 59 --docusaurus-details-decoration-color: currentColor; 60 60 font: var(--ifm-heading-font-weight) var(--ifm-h5-font-size) / var(--ifm-heading-line-height) var(--ifm-heading-font-family); 61 61 62 + &::before { 63 + top: 0.40rem; 64 + } 65 + 62 66 .admoIcon { 63 67 display: inline-block; 64 68 vertical-align: middle;