[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: Overhaul kitchensink

FoxxMD (May 15, 2026, 3:14 PM UTC) 396e4b92 14ecb572

+688 -326
+177
docsite/docs/configuration/_kitchensink_configs/_multi-persons-services.mdx
··· 1 + import Tabs from '@theme/Tabs'; 2 + import TabItem from '@theme/TabItem'; 3 + 4 + <Tabs groupId="configType" queryString> 5 + <TabItem value="file" label="File"> 6 + 7 + Using [File Config](/configuration/?configType=file#configuration-types) 8 + 9 + ```json5 title="CONFIG_DIR/jellyin.json" 10 + [ 11 + { 12 + "id": "fredJf", 13 + "name": "Freds Jellyfin", 14 + "clients": ["fredLFM"], 15 + "data": { 16 + "url": "https://jellyfin.fred.com", 17 + "user": "Fred", 18 + "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c" 19 + } 20 + }, 21 + { 22 + "id": "maryJf", 23 + "name": "Marys Jellyfin", 24 + "clients": ["maryLFM"], 25 + "data": { 26 + "url": "https://jellyfin.mary.com", 27 + "user": "Mary", 28 + "apiKey": "26fe9c5dc6374542adc4f4d5e8352838" 29 + } 30 + } 31 + ] 32 + ``` 33 + 34 + ```json5 title="CONFIG_DIR/plex.json" 35 + [ 36 + { 37 + "id": "foxxPlex", 38 + "name": "Foxx Plex", 39 + "clients": ["foxxKoi"], 40 + "data": { 41 + "token": "JtRnwQWD__XMJF8sT3jc", 42 + "url": "192.168.0.233:32400" 43 + } 44 + } 45 + ] 46 + ``` 47 + 48 + ```json5 title="CONFIG_DIR/lastfm.json" 49 + [ 50 + { 51 + "id": "maryLFM", 52 + "name": "Marys Lastfm", 53 + "configureAs": "client", 54 + "data": { 55 + "apiKey": "maryApiKey", 56 + "secret": "marySecret", 57 + "redirectUri": "http://localhost:9078/lastfm/callback" 58 + } 59 + }, 60 + { 61 + "id": "fredLFM", 62 + "name": "Freds Lastfm", 63 + "configureAs": "client", 64 + "data": { 65 + "apiKey": "fredApiKey", 66 + "secret": "fredSecret", 67 + "redirectUri": "http://localhost:9078/lastfm/callback" 68 + } 69 + } 70 + ] 71 + ``` 72 + 73 + ```json5 title="CONFIG_DIR/koito.json" 74 + [ 75 + { 76 + "id": "foxxKoi", 77 + "name": "Foxx Koito", 78 + "configureAs": "client", 79 + "data": { 80 + "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b", 81 + "username": "admin", 82 + "url": "http://192.168.0.100:4110" 83 + } 84 + } 85 + ] 86 + ``` 87 + 88 + </TabItem> 89 + 90 + <TabItem value="aio" label="AIO"> 91 + 92 + Using [AIO Config](/configuration/?configType=aio#configuration-types) 93 + 94 + ```json5 title="CONFIG_DIR/config.json" 95 + { 96 + "sources": [ 97 + { 98 + "type": "jellyfin", 99 + "id": "fredJf", 100 + "name": "Freds Jellyfin", 101 + "clients": [ 102 + "fredLFM" 103 + ], 104 + "data": { 105 + "url": "https://jellyfin.fred.com", 106 + "user": "Fred", 107 + "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c" 108 + } 109 + }, 110 + { 111 + "type": "jellyfin", 112 + "id": "maryJf", 113 + "name": "Marys Jellyfin", 114 + "clients": [ 115 + "maryLFM" 116 + ], 117 + "data": { 118 + "url": "https://jellyfin.mary.com", 119 + "user": "Mary", 120 + "apiKey": "26fe9c5dc6374542adc4f4d5e8352838" 121 + } 122 + }, 123 + { 124 + "type": "plex", 125 + "id": "foxxPlex", 126 + "name": "Foxx Plex", 127 + "clients": [ 128 + "foxxKoi" 129 + ], 130 + "data": { 131 + "token": "JtRnwQWD__XMJF8sT3jc", 132 + "url": "192.168.0.233:32400", 133 + "usersallow": [ 134 + "foxx" 135 + ] 136 + } 137 + } 138 + ], 139 + "clients": [ 140 + { 141 + "type": "lastfm", 142 + "id": "maryLFM", 143 + "name": "Marys Lastfm", 144 + "configureAs": "client", 145 + "data": { 146 + "apiKey": "maryApiKey", 147 + "secret": "marySecret", 148 + "redirectUri": "http://localhost:9078/lastfm/callback" 149 + } 150 + }, 151 + { 152 + "type": "lastfm", 153 + "id": "fredLFM", 154 + "name": "Freds Lastfm", 155 + "configureAs": "client", 156 + "data": { 157 + "apiKey": "fredApiKey", 158 + "secret": "fredSecret", 159 + "redirectUri": "http://localhost:9078/lastfm/callback" 160 + } 161 + }, 162 + { 163 + "type": "koito", 164 + "id": "foxxKoi", 165 + "name": "Foxx Koito", 166 + "configureAs": "client", 167 + "data": { 168 + "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b", 169 + "username": "admin", 170 + "url": "http://192.168.0.100:4110" 171 + } 172 + } 173 + ] 174 + } 175 + ``` 176 + </TabItem> 177 + </Tabs>
+196
docsite/docs/configuration/_kitchensink_configs/_multi-sources-clients.mdx
··· 1 + import Tabs from '@theme/Tabs'; 2 + import TabItem from '@theme/TabItem'; 3 + 4 + <Tabs groupId="configType" queryString> 5 + <TabItem value="env" label="ENV"> 6 + 7 + Using [ENV Config](/configuration/?configType=env#configuration-types) 8 + 9 + ```yaml title="compose.yaml" 10 + services: 11 + multi-scrobbler: 12 + image: foxxmd/multi-scrobbler 13 + container_name: multi-scrobbler 14 + environment: 15 + - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 16 + # spotify 17 + - SPOTIFY_ID=foxxSpotify 18 + - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs 19 + - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 20 + - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback 21 + 22 + # navidrome listenbrainz endpoint 23 + - LZE_ID=myLzNavidrome 24 + - LZE_TOKEN=myToken 25 + 26 + # plex 27 + - PLEX_ID=foxxPlex 28 + - PLEX_URL=192.168.0.233:32400 29 + - PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc 30 + - PLEX_USERS_ALLOW=foxx 31 + - PLEX_LIBRARIES_ALLOW=oldies 32 + 33 + # lastfm 34 + - LASTFM_ID=myLFM 35 + - LASTFM_API_KEY=myApiKey 36 + - LASTFM_SECRET=mySecret 37 + - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback 38 + 39 + # koito 40 + - KOITO_ID=foxxKoi 41 + - KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b 42 + - KOITO_USER=admin 43 + - KOITO_URL=http://192.168.0.100:4110 44 + 45 + volumes: 46 + - "./config:/config" 47 + ports: 48 + - "9078:9078" 49 + restart: unless-stopped 50 + ``` 51 + 52 + </TabItem> 53 + <TabItem value="file" label="File"> 54 + 55 + Using [File Config](/configuration/?configType=file#configuration-types) 56 + 57 + ```json5 title="CONFIG_DIR/spotify.json" 58 + [ 59 + { 60 + "id": "foxxSpotify", 61 + "name": "Foxx Spotify", 62 + "data": { 63 + "clientId": "a89cba1569901a0671d5a9875fed4be1", 64 + "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 65 + "redirectUri": "http://localhost:9078/callback", 66 + "interval": 60 67 + } 68 + } 69 + ] 70 + ``` 71 + 72 + ```json5 title="CONFIG_DIR/endpointlz.json" 73 + [ 74 + { 75 + "id": "myLzNavidrome", 76 + "name": "LZ for Navidrome", 77 + "data": { 78 + "token": "myToken" 79 + } 80 + } 81 + ] 82 + ``` 83 + 84 + ```json5 title="CONFIG_DIR/plex.json" 85 + [ 86 + { 87 + "id": "foxxPlex", 88 + "name": "Foxx Plex", 89 + "data": { 90 + "token": "JtRnwQWD__XMJF8sT3jc", 91 + "url": "192.168.0.233:32400", 92 + "usersallow": ["foxx"], 93 + "librariesAllow": ["oldies"], 94 + } 95 + } 96 + ] 97 + ``` 98 + 99 + ```json5 title="CONFIG_DIR/lastfm.json" 100 + [ 101 + { 102 + "id": "myLFM", 103 + "name": "Old Lastfm", 104 + "configureAs": "client", 105 + "data": { 106 + "apiKey": "myApiKey", 107 + "secret": "mySecret", 108 + "redirectUri": "http://localhost:9078/lastfm/callback" 109 + } 110 + } 111 + ] 112 + ``` 113 + 114 + ```json5 title="CONFIG_DIR/koito.json" 115 + [ 116 + { 117 + "id": "foxxKoi", 118 + "name": "Foxx Koito", 119 + "configureAs": "client", 120 + "data": { 121 + "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b", 122 + "username": "admin", 123 + "url": "http://192.168.0.100:4110" 124 + } 125 + } 126 + ] 127 + ``` 128 + 129 + </TabItem> 130 + 131 + <TabItem value="aio" label="AIO"> 132 + 133 + Using [AIO Config](/configuration/?configType=aio#configuration-types) 134 + 135 + ```json5 title="CONFIG_DIR/config.json" 136 + { 137 + "sources": [ 138 + { 139 + "type": "spotify", 140 + "id": "foxxSpotify", 141 + "name": "Foxx Spotify", 142 + "data": { 143 + "clientId": "a89cba1569901a0671d5a9875fed4be1", 144 + "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 145 + "redirectUri": "http://localhost:9078/callback", 146 + "interval": 60 147 + } 148 + }, 149 + { 150 + "type": "endpointlz", 151 + "name": "LZ for Navidrome", 152 + "id": "myLzNavidrome", 153 + "data": { 154 + "token": "myToken" 155 + } 156 + }, 157 + { 158 + "type": "plex", 159 + "id": "foxxPlex", 160 + "name": "Foxx Plex", 161 + "data": { 162 + "token": "JtRnwQWD__XMJF8sT3jc", 163 + "url": "192.168.0.233:32400", 164 + "usersallow": ["foxx"], 165 + "librariesAllow": ["oldies"] 166 + } 167 + } 168 + ], 169 + "clients": [ 170 + { 171 + "type": "lastfm", 172 + "id": "myLFM", 173 + "name": "Old Lastfm", 174 + "configureAs": "client", 175 + "data": { 176 + "apiKey": "myApiKey", 177 + "secret": "mySecret", 178 + "redirectUri": "http://localhost:9078/lastfm/callback" 179 + } 180 + }, 181 + { 182 + "type": "koito", 183 + "id": "foxxKoi", 184 + "name": "Foxx Koito", 185 + "configureAs": "client", 186 + "data": { 187 + "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b", 188 + "username": "admin", 189 + "url": "http://192.168.0.100:4110" 190 + } 191 + } 192 + ] 193 + } 194 + ``` 195 + </TabItem> 196 + </Tabs>
+226
docsite/docs/configuration/_kitchensink_configs/_musicbrainz.mdx
··· 1 + import Tabs from '@theme/Tabs'; 2 + import TabItem from '@theme/TabItem'; 3 + 4 + <Tabs groupId="configType" queryString> 5 + <TabItem value="env" label="ENV"> 6 + 7 + Using [ENV Config](/configuration/?configType=env#configuration-types) 8 + 9 + ```yaml title="compose.yaml" 10 + services: 11 + multi-scrobbler: 12 + image: foxxmd/multi-scrobbler 13 + container_name: multi-scrobbler 14 + environment: 15 + - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 16 + 17 + # required setup for musicbrainz 18 + - MB_CONTACT=contact@mydomain.com # a real email 19 + # searches with sensible release sorting with the searchOrder 20 + # isrc => basic => artist (native mode) 21 + - MB_PRESETS=default,sensible,native 22 + 23 + # spotify 24 + - SPOTIFY_ID=foxxSpotify 25 + - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs 26 + - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 27 + - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback 28 + 29 + # navidrome listenbrainz endpoint 30 + - LZE_ID=myLzNavidrome 31 + - LZE_TOKEN=myToken 32 + # applies musicbrainz Stage to preTransform of navidrome source 33 + - LZE_TRANSFORMS=musicbrainz 34 + 35 + # lastfm 36 + - LASTFM_ID=myLFM 37 + - LASTFM_API_KEY=myApiKey 38 + - LASTFM_SECRET=mySecret 39 + - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback 40 + 41 + volumes: 42 + - "./config:/config" 43 + ports: 44 + - "9078:9078" 45 + restart: unless-stopped 46 + ``` 47 + 48 + </TabItem> 49 + <TabItem value="file" label="File"> 50 + 51 + Using [File Config](/configuration/?configType=file#configuration-types) 52 + 53 + For non-ENV config, [Musicbrainz Transformer](/configuration/transforms/musicbrainz/#api-setup) must be setup using the [AIO Config](/configuration/?configType=aio#configuration-types) `config.json` file. This configuration uses the [sensible defaults](/configuration/transforms/musicbrainz/#sensible-default) in the `defaults` property. This is a suggestion and can be removed if not desired. 54 + 55 + ```json5 title="CONFIG_DIR/config.json" 56 + { 57 + "transformers": [ 58 + { 59 + "type": "musicbrainz", 60 + "name": "MyMB", 61 + "data": { 62 + "apis": [ 63 + { 64 + "contact": "contact@mydomain.com" 65 + } 66 + ] 67 + }, 68 + "defaults": { 69 + "releaseStatusPriority": ["official"], 70 + "releaseGroupPrimaryTypePriority": [ 71 + "album", 72 + "single", 73 + "ep" 74 + ], 75 + "releaseCountryPriority": ["XW"], 76 + "searchArtistMethod": "native", 77 + "searchOrder": [ 78 + "isrc", 79 + "basic", 80 + "artist" 81 + ] 82 + } 83 + } 84 + ] 85 + } 86 + ``` 87 + 88 + ```json5 title="CONFIG_DIR/spotify.json" 89 + [ 90 + { 91 + "id": "foxxSpotify", 92 + "name": "Foxx Spotify", 93 + "data": { 94 + "clientId": "a89cba1569901a0671d5a9875fed4be1", 95 + "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 96 + "redirectUri": "http://localhost:9078/callback", 97 + "interval": 60 98 + } 99 + } 100 + ] 101 + ``` 102 + 103 + ```json5 title="CONFIG_DIR/endpointlz.json" 104 + [ 105 + { 106 + "id": "myLzNavidrome", 107 + "name": "LZ for Navidrome", 108 + "data": { 109 + "token": "myToken" 110 + }, 111 + "options": { 112 + "playTransform": { 113 + "preCompare": [ 114 + { 115 + "type": "musicbrainz", 116 + "name": "MyMB" 117 + } 118 + ] 119 + } 120 + } 121 + } 122 + ] 123 + ``` 124 + 125 + 126 + ```json5 title="CONFIG_DIR/lastfm.json" 127 + [ 128 + { 129 + "id": "myLFM", 130 + "name": "Old Lastfm", 131 + "configureAs": "client", 132 + "data": { 133 + "apiKey": "myApiKey", 134 + "secret": "mySecret", 135 + "redirectUri": "http://localhost:9078/lastfm/callback" 136 + } 137 + } 138 + ] 139 + ``` 140 + 141 + </TabItem> 142 + 143 + <TabItem value="aio" label="AIO"> 144 + 145 + Using [AIO Config](/configuration/?configType=aio#configuration-types) 146 + 147 + This configuration uses the [sensible defaults](/configuration/transforms/musicbrainz/#sensible-default) in the `defaults` property. This is a suggestion and can be removed if not desired. 148 + 149 + ```json5 title="CONFIG_DIR/config.json" 150 + { 151 + "transformers": [ 152 + { 153 + "type": "musicbrainz", 154 + "name": "MyMB", 155 + "data": { 156 + "apis": [ 157 + { 158 + "contact": "contact@mydomain.com" 159 + } 160 + ] 161 + }, 162 + "defaults": { 163 + "releaseStatusPriority": ["official"], 164 + "releaseGroupPrimaryTypePriority": [ 165 + "album", 166 + "single", 167 + "ep" 168 + ], 169 + "releaseCountryPriority": ["XW"], 170 + "searchArtistMethod": "native", 171 + "searchOrder": [ 172 + "isrc", 173 + "basic", 174 + "artist" 175 + ] 176 + } 177 + } 178 + ], 179 + "sources": [ 180 + { 181 + "type": "spotify", 182 + "id": "foxxSpotify", 183 + "name": "Foxx Spotify", 184 + "data": { 185 + "clientId": "a89cba1569901a0671d5a9875fed4be1", 186 + "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 187 + "redirectUri": "http://localhost:9078/callback", 188 + "interval": 60 189 + } 190 + }, 191 + { 192 + "type": "endpointlz", 193 + "name": "LZ for Navidrome", 194 + "id": "myLzNavidrome", 195 + "data": { 196 + "token": "myToken" 197 + }, 198 + "options": { 199 + "playTransform": { 200 + "preCompare": [ 201 + { 202 + "type": "musicbrainz", 203 + "name": "MyMB" 204 + } 205 + ] 206 + } 207 + } 208 + } 209 + ], 210 + "clients": [ 211 + { 212 + "type": "lastfm", 213 + "id": "myLFM", 214 + "name": "Old Lastfm", 215 + "configureAs": "client", 216 + "data": { 217 + "apiKey": "myApiKey", 218 + "secret": "mySecret", 219 + "redirectUri": "http://localhost:9078/lastfm/callback" 220 + } 221 + } 222 + ] 223 + } 224 + ``` 225 + </TabItem> 226 + </Tabs>
+75 -326
docsite/docs/configuration/kitchensink.mdx
··· 1 1 --- 2 2 sidebar_position: 5 3 3 title: Kitchen Sink 4 - description: Kitchen Sink Example 4 + description: Kitchen Sink Examples 5 5 --- 6 6 7 - # Example Complex Scenario 7 + import Tabs from '@theme/Tabs'; 8 + import TabItem from '@theme/TabItem'; 9 + import MultiUsecase from "@site/src/components/snippets/_scenario-config-multi.mdx" 10 + import MultiPersonsServices from "@site/docs/configuration/_kitchensink_configs/_multi-persons-services.mdx" 11 + import MultiSourcesClients from "@site/docs/configuration/_kitchensink_configs/_multi-sources-clients.mdx" 12 + import Musicbrainz from "@site/docs/configuration/_kitchensink_configs/_musicbrainz.mdx" 13 + import SingleUsecase from "@site/src/components/snippets/_scenario-config-single.mdx" 14 + 15 + ## What's This? 16 + 17 + On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent [configuration types](/configuration#configuration-types) to fulfill that usecase. 18 + 19 + These example are useful for: 20 + 21 + * getting an idea of what you can do with Multi-scrobbler 22 + * using these examples as a starting point for your own configuration 23 + * providing an example of the same configuration across different [configuration types](/configuration#configuration-types) 24 + 25 + :::tip 26 + 27 + More common, straightforward scenarios can be found in the [**quickstart**](/quickstart) guide. 28 + 29 + ::: 30 + 31 + ## Examples 32 + 33 + ### Multiple Sources to Multiple Clients {#multi-sources-clients} 34 + 35 + You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services. 36 + 37 + * You want to **scrobble from...** 38 + * A [Spotify](/configuration/sources/spotify) account 39 + * A Navidrome instance that you want to use with the built-in [listenbrainz](/configuration/sources/listenbrainz-endpoint) scrobble function 40 + * A shared [Plex](/configuration/sources/plex) instance that you want to scrobble only from a specific library named `oldies` 41 + * You want to **scrobble to...** 42 + * Your decades-old [Last.fm](/configuration/clients/lastfm) account 43 + * A [Koito](/configuration/clients/koito) server for backup 44 + 45 + <details> 46 + 47 + <summary>Configuration</summary> 48 + 49 + <MultiSourcesClients/> 50 + 51 + </details> 52 + 53 + ### Scrobble for Multiple People to Multiple Clients {#multi-persons-services} 54 + 55 + <MultiUsecase/> 8 56 9 - Scenario: 57 + You want to scrobble plays for yourself (Foxx), Fred, and Mary: 10 58 11 - * You want to scrobble plays for yourself (Foxx), Fred, and Mary 12 - * Each person has their own [Maloja](/configuration/clients/maloja) server 13 - * Each person has their own Spotify account 14 - * You have your own Airsonic ([subsonic](/configuration/sources/subsonic)) server you to scrobble from 15 - * You have your own [Youtube Music](/configuration/sources/youtube-music) account you want to scrobble from 16 - * Mary has her own [Last.fm](/configuration/clients/lastfm) account she also wants to scrobble to 17 - * Fred has his own [Spotify](/configuration/sources/spotify) application and provides you with just his access and refresh token because he doesn't trust you (wtf Fred) 18 - * Fred has a Plex server and wants to scrobble everything he plays 19 - * Mary uses Fred's Plex server but only wants to scrobble her plays from the `podcast` library 20 - * The three of you have a shared library on [Plex](/configuration/sources/plex) called `party` that you only play when you are hanging out. You want plays from that library to be scrobbled to everyone's servers. 21 - * Fred also has his own [Jellyfin server](/configuration/sources/jellyfin) and wants to scrobble everything he plays 22 - * You have an android music app that can scrobble to a [custom listenbrainz server](/configuration/sources/listenbrainz-endpoint) 59 + * The three of you want to **scrobble from...** 60 + * Fred and Mary each have their own [Jellyfin servers](/configuration/sources/jellyfin) 61 + * You have a [Plex](/configuration/sources/plex) server 62 + * The three of you want to **scrobble to...** 63 + * Fred and Mary each have their own [Last.fm](/configuration/clients/lastfm) accounts 64 + * You have a [Koito](/configuration/clients/koito) server 23 65 24 - ### All-in-one Config 66 + <details> 25 67 26 - ```json5 title="CONFIG_DIR/config.json" 27 - { 28 - "sourceDefaults": { 29 - "maxPollRetries": 0, // optional, default # of automatic polling restarts on error. can be overridden by property in individual config 30 - "maxRequestRetries": 1, // optional, default # of http request retries a source can make before error is thrown. can be overridden by property in individual config 31 - "retryMultiplier": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config 32 - }, 33 - "clientDefaults": { 34 - "maxRequestRetries": 1, // optional, default # of http request retries a client can make before error is thrown. can be overridden by property in individual config 35 - "retryMultiplier": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config 36 - }, 37 - "sources": [ 38 - { 39 - "type": "spotify", 40 - "id": "foxxSpot", 41 - "name": "Foxx Spotify", 42 - "clients": ["foxxMaloja"], 43 - "data": { 44 - "clientId": "foxxSpotifyAppId", 45 - "clientSecret": "foxxSpotifyAppSecret", 46 - }, 47 - "options": { 48 - "maxRequestRetries": 2, // override default max retries because spotify can...spotty 49 - } 50 - }, 51 - { 52 - "type": "spotify", 53 - "id": "marySpot", 54 - "name": "Marys Spotify", 55 - "clients": ["maryMaloja"], 56 - "data": { 57 - "clientId": "foxxSpotifyAppId", // only need one application, it can be used by all users of this multi-scrobbler instance 58 - "clientSecret": "foxxSpotifyAppSecret", 59 - } 60 - }, 61 - { 62 - "type": "spotify", 63 - "id": "fredSpot", 64 - "name": "Freds Spotify", 65 - "clients": ["fredMaloja"], 66 - "data": { 67 - "accessToken": "fredsToken", 68 - "refreshToken": "fredsRefreshToken", 69 - "interval": 120, // he also wants a slower check interval because his application already has heavy api usage 70 - } 71 - }, 72 - { 73 - "type": "plex", 74 - "id": "fredPlex", 75 - "name": "Freds Plex", 76 - "clients": ["fredMaloja"], 77 - "data": { 78 - "token": "JtRnwQWD__XMJF8sT3jc", 79 - "url": "192.168.0.233:32400", 80 - "usersallow": ["fredUser"] 81 - } 82 - }, 83 - { 84 - "type": "plex", 85 - "id": "maryPlex", 86 - "name": "Marys Plex", 87 - "clients": ["maryMaloja"], 88 - "data": { 89 - "token": "JtRnwQWD__XMJF8sT3jc", 90 - "url": "192.168.0.233:32400", 91 - "usersallow": ["maryUser"], // still need to specify mary as user so not all users who play from 'podcasts' get scrobbled 92 - "librariesAllow": ["podcasts"] 93 - } 94 - }, 95 - { 96 - "type": "plex", 97 - "id": "partyPlex", 98 - "name": "Party Library", 99 - // omitting clients (or making it empty) will make this Source scrobble to all Clients 100 - "data": { 101 - "token": "JtRnwQWD__XMJF8sT3jc", 102 - "url": "192.168.0.233:32400", 103 - "librariesAllow": ["party"] 104 - } 105 - }, 106 - { 107 - "type": "jellyfin", 108 - "id": "fredJelly", 109 - "name": "Freds Jellyfin", 110 - // omitting clients (or making it empty) will make this Source scrobble to all Clients 111 - "data": { 112 - "url": "http://localhost:8096", 113 - "user": "FoxxMD", 114 - "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c", 115 - "usersAllow": ["fredUser"] 116 - } 117 - }, 118 - { 119 - "type": "subsonic", 120 - "id": "foxxNavi", 121 - "name": "Foxx Navidrome", 122 - "clients": ["foxxMaloja"], 123 - "data": { 124 - "user": "foxx", 125 - "password": "foxxPassword", 126 - "url": "https://navidrome.foxx.example" 127 - } 128 - }, 129 - { 130 - "type": "ytmusic", 131 - "id": "foxxTube", 132 - "name": "Foxx YT", 133 - "clients": ["foxxMaloja"], 134 - "data": { 135 - "cookie": "__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...", 136 - } 137 - }, 138 - { 139 - "type": "endpointlz", 140 - "id": "lzFoxx", 141 - "name": "Foxx LZ", 142 - "clients": ["foxxMaloja"], 143 - "data": { 144 - "token": "myToken" 145 - } 146 - } 147 - ], 148 - "clients": [ 149 - { 150 - "type": "maloja", 151 - "id": "foxxMaloja", 152 - "name": "Foxx Maloja", 153 - "data": { 154 - "url": "https://maloja.foxx.example", 155 - "apiKey": "foxxApiKey" 156 - } 157 - }, 158 - { 159 - "type": "maloja", 160 - "id": "fredMaloja", 161 - "name": "Fred Maloja", 162 - "data": { 163 - "url": "https://maloja.fred.example", 164 - "apiKey": "fredApiKey" 165 - } 166 - }, 167 - { 168 - "type": "maloja", 169 - "id": "maryMaloja", 170 - "name": "Mary Maloja", 171 - "data": { 172 - "url": "https://maloja.mary.example", 173 - "apiKey": "maryApiKey" 174 - } 175 - }, 176 - { 177 - "type": "lastfm", 178 - "id": "maryLFM" 179 - "name": "Mary Lastfm", 180 - "data": { 181 - "apiKey": "maryApiKey", 182 - "secret": "marySecret", 183 - "redirectUri": "http://localhost:9078/lastfm/callback" 184 - } 185 - } 186 - ] 187 - } 68 + <summary>Configuration</summary> 69 + 70 + <MultiPersonsServices/> 188 71 189 - ``` 72 + </details> 190 73 191 - ### Separate JSON files 74 + ### Use Musicbrainz to Fix Scrobbles from Navidrome 192 75 193 - ```json5 title="CONFIG_DIR/spotify.json" 194 - [ 195 - { 196 - // may omit 'type' property since app knows this is file is for spotify configs 197 - "id": "foxxSpot", 198 - "name": "Foxx Spotify", 199 - "clients": ["foxxMaloja"], 200 - "data": { 201 - "clientId": "foxxSpotifyAppId", 202 - "clientSecret": "foxxSpotifyAppSecret" 203 - } 204 - }, 205 - { 206 - "id": "marySpot", 207 - "name": "Marys Spotify", 208 - "clients": ["maryMaloja"], 209 - "data": { 210 - "clientId": "foxxSpotifyAppId", 211 - "clientSecret": "foxxSpotifyAppSecret" 212 - } 213 - }, 214 - { 215 - "type": "spotify", 216 - "id": "fredSpot", 217 - "clients": ["fredMaloja"], 218 - "data": { 219 - "accessToken": "fredsToken", 220 - "refreshToken": "fredsRefreshToken", 221 - "interval": 120 222 - } 223 - }, 224 - ] 225 - ``` 76 + You have multiple Sources of music but your personal, on-filesystem music collection is not well organized. 226 77 227 - ```json5 title="CONFIG_DIR/plex.json" 228 - [ 229 - { 230 - "type": "plex", 231 - "id": "fredPlex", 232 - "clients": ["fredMaloja"], 233 - "data": { 234 - "token": "JtRnwQWD__XMJF8sT3jc", 235 - "url": "192.168.0.233:32400", 236 - "usersallow": ["fredUser"] 237 - } 238 - }, 239 - { 240 - "type": "plex", 241 - "id": "maryPlex", 242 - "clients": ["maryMaloja"], 243 - "data": { 244 - "token": "JtRnwQWD__XMJF8sT3jc", 245 - "url": "192.168.0.233:32400", 246 - "usersallow": ["maryUser"], 247 - "librariesAllow": ["podcasts"] 248 - } 249 - }, 250 - { 251 - "type": "plex", 252 - "id": "partyPlex", 253 - "data": { 254 - "token": "JtRnwQWD__XMJF8sT3jc", 255 - "url": "192.168.0.233:32400", 256 - "librariesAllow": ["party"] 257 - } 258 - } 259 - ] 260 - ``` 78 + You want to use the [Musicbrainz Transformer](/configuration/transforms/musicbrainz) to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized. 261 79 262 - ```json5 title="CONFIG_DIR/jellyfin.json" 263 - [ 264 - { 265 - "type": "jellyfin", 266 - "id": "fredJelly", 267 - "data": { 268 - "url": "http://localhost:8096", 269 - "user": "FoxxMD", 270 - "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c", 271 - "usersAllow": ["fredUser"] 272 - } 273 - } 274 - ] 275 - ``` 80 + * You want to **scrobble from...** 81 + * A [Spotify](/configuration/sources/spotify) account 82 + * A Navidrome instance that you want to use with the built-in [listenbrainz](/configuration/sources/listenbrainz-endpoint) scrobble function 83 + * Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients 84 + * You want to **scrobble to...** 85 + * A [Last.fm](/configuration/clients/lastfm) account 276 86 277 - ```json5 title="CONFIG_DIR/ytmusic.json" 278 - [ 279 - { 280 - "type": "ytmusic", 281 - "id": "foxxTube", 282 - "clients": ["foxxMaloja"], 283 - "data": { 284 - "cookie": "__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...", 285 - } 286 - } 287 - ] 288 - ``` 289 - ```json5 title="CONFIG_DIR/endpointlz.json" 290 - [ 291 - { 292 - "id": "lzFoxx", 293 - "name": "Foxx LZ", 294 - "clients": ["foxxMaloja"], 295 - "data": { 296 - "token": "myToken", 297 - } 298 - } 299 - ] 300 - ``` 87 + <details> 301 88 302 - ```json5 title="CONFIG_DIR/maloja.json" 303 - [ 304 - { 305 - "type": "maloja", 306 - "id": "foxxMaloja", 307 - "data": { 308 - "url": "https://maloja.foxx.example", 309 - "apiKey": "foxxApiKey" 310 - } 311 - }, 312 - { 313 - "type": "maloja", 314 - "id": "fredMaloja", 315 - "data": { 316 - "url": "https://maloja.fred.example", 317 - "apiKey": "fredApiKey" 318 - } 319 - }, 320 - { 321 - "type": "maloja", 322 - "id": "maryMaloja", 323 - "data": { 324 - "url": "https://maloja.mary.example", 325 - "apiKey": "maryApiKey" 326 - } 327 - } 328 - ] 329 - ``` 89 + <summary>Configuration</summary> 330 90 331 - ```json5 title="CONFIG_DIR/lastfm.json" 332 - [ 333 - { 334 - "type": "lastfm", 335 - "id": "maryLFM" 336 - "data": { 337 - "apiKey": "maryApiKey", 338 - "secret": "marySecret", 339 - "redirectUri": "http://localhost:9078/lastfm/callback" 340 - } 341 - } 342 - ] 343 - ``` 91 + <Musicbrainz/> 344 92 93 + </details>
+7
docsite/src/components/snippets/_scenario-config-multi.mdx
··· 1 + <DetailsAdmo type="important" summary="ENV Config Not Possible"> 2 + 3 + In this usescase there is **more than one of the same type of Source/Client.** 4 + 5 + This means only **File** or **AIO** [configuration types](/configuration#configuration-types) are possible because [ENV](/configuration/?configType=env#configuration-types) configuration only supports one Source/Client per type. 6 + 7 + </DetailsAdmo>
+7
docsite/src/components/snippets/_scenario-config-single.mdx
··· 1 + :::note 2 + 3 + In this usescase there is **at most one type of Source/Client**. 4 + 5 + This means it is possible to use any [configuration type](/configuration#configuration-types). 6 + 7 + :::