···11---
22sidebar_position: 5
33title: Kitchen Sink
44-description: Kitchen Sink Example
44+description: Kitchen Sink Examples
55---
6677-# Example Complex Scenario
77+import Tabs from '@theme/Tabs';
88+import TabItem from '@theme/TabItem';
99+import MultiUsecase from "@site/src/components/snippets/_scenario-config-multi.mdx"
1010+import MultiPersonsServices from "@site/docs/configuration/_kitchensink_configs/_multi-persons-services.mdx"
1111+import MultiSourcesClients from "@site/docs/configuration/_kitchensink_configs/_multi-sources-clients.mdx"
1212+import Musicbrainz from "@site/docs/configuration/_kitchensink_configs/_musicbrainz.mdx"
1313+import SingleUsecase from "@site/src/components/snippets/_scenario-config-single.mdx"
1414+1515+## What's This?
1616+1717+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.
1818+1919+These example are useful for:
2020+2121+* getting an idea of what you can do with Multi-scrobbler
2222+* using these examples as a starting point for your own configuration
2323+* providing an example of the same configuration across different [configuration types](/configuration#configuration-types)
2424+2525+:::tip
2626+2727+More common, straightforward scenarios can be found in the [**quickstart**](/quickstart) guide.
2828+2929+:::
3030+3131+## Examples
3232+3333+### Multiple Sources to Multiple Clients {#multi-sources-clients}
3434+3535+You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services.
3636+3737+* You want to **scrobble from...**
3838+ * A [Spotify](/configuration/sources/spotify) account
3939+ * A Navidrome instance that you want to use with the built-in [listenbrainz](/configuration/sources/listenbrainz-endpoint) scrobble function
4040+ * A shared [Plex](/configuration/sources/plex) instance that you want to scrobble only from a specific library named `oldies`
4141+* You want to **scrobble to...**
4242+ * Your decades-old [Last.fm](/configuration/clients/lastfm) account
4343+ * A [Koito](/configuration/clients/koito) server for backup
4444+4545+<details>
4646+4747+<summary>Configuration</summary>
4848+4949+<MultiSourcesClients/>
5050+5151+</details>
5252+5353+### Scrobble for Multiple People to Multiple Clients {#multi-persons-services}
5454+5555+<MultiUsecase/>
85699-Scenario:
5757+You want to scrobble plays for yourself (Foxx), Fred, and Mary:
10581111-* You want to scrobble plays for yourself (Foxx), Fred, and Mary
1212-* Each person has their own [Maloja](/configuration/clients/maloja) server
1313-* Each person has their own Spotify account
1414-* You have your own Airsonic ([subsonic](/configuration/sources/subsonic)) server you to scrobble from
1515-* You have your own [Youtube Music](/configuration/sources/youtube-music) account you want to scrobble from
1616-* Mary has her own [Last.fm](/configuration/clients/lastfm) account she also wants to scrobble to
1717-* 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)
1818-* Fred has a Plex server and wants to scrobble everything he plays
1919-* Mary uses Fred's Plex server but only wants to scrobble her plays from the `podcast` library
2020-* 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.
2121-* Fred also has his own [Jellyfin server](/configuration/sources/jellyfin) and wants to scrobble everything he plays
2222-* You have an android music app that can scrobble to a [custom listenbrainz server](/configuration/sources/listenbrainz-endpoint)
5959+* The three of you want to **scrobble from...**
6060+ * Fred and Mary each have their own [Jellyfin servers](/configuration/sources/jellyfin)
6161+ * You have a [Plex](/configuration/sources/plex) server
6262+* The three of you want to **scrobble to...**
6363+ * Fred and Mary each have their own [Last.fm](/configuration/clients/lastfm) accounts
6464+ * You have a [Koito](/configuration/clients/koito) server
23652424-### All-in-one Config
6666+<details>
25672626-```json5 title="CONFIG_DIR/config.json"
2727-{
2828- "sourceDefaults": {
2929- "maxPollRetries": 0, // optional, default # of automatic polling restarts on error. can be overridden by property in individual config
3030- "maxRequestRetries": 1, // optional, default # of http request retries a source can make before error is thrown. can be overridden by property in individual config
3131- "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
3232- },
3333- "clientDefaults": {
3434- "maxRequestRetries": 1, // optional, default # of http request retries a client can make before error is thrown. can be overridden by property in individual config
3535- "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
3636- },
3737- "sources": [
3838- {
3939- "type": "spotify",
4040- "id": "foxxSpot",
4141- "name": "Foxx Spotify",
4242- "clients": ["foxxMaloja"],
4343- "data": {
4444- "clientId": "foxxSpotifyAppId",
4545- "clientSecret": "foxxSpotifyAppSecret",
4646- },
4747- "options": {
4848- "maxRequestRetries": 2, // override default max retries because spotify can...spotty
4949- }
5050- },
5151- {
5252- "type": "spotify",
5353- "id": "marySpot",
5454- "name": "Marys Spotify",
5555- "clients": ["maryMaloja"],
5656- "data": {
5757- "clientId": "foxxSpotifyAppId", // only need one application, it can be used by all users of this multi-scrobbler instance
5858- "clientSecret": "foxxSpotifyAppSecret",
5959- }
6060- },
6161- {
6262- "type": "spotify",
6363- "id": "fredSpot",
6464- "name": "Freds Spotify",
6565- "clients": ["fredMaloja"],
6666- "data": {
6767- "accessToken": "fredsToken",
6868- "refreshToken": "fredsRefreshToken",
6969- "interval": 120, // he also wants a slower check interval because his application already has heavy api usage
7070- }
7171- },
7272- {
7373- "type": "plex",
7474- "id": "fredPlex",
7575- "name": "Freds Plex",
7676- "clients": ["fredMaloja"],
7777- "data": {
7878- "token": "JtRnwQWD__XMJF8sT3jc",
7979- "url": "192.168.0.233:32400",
8080- "usersallow": ["fredUser"]
8181- }
8282- },
8383- {
8484- "type": "plex",
8585- "id": "maryPlex",
8686- "name": "Marys Plex",
8787- "clients": ["maryMaloja"],
8888- "data": {
8989- "token": "JtRnwQWD__XMJF8sT3jc",
9090- "url": "192.168.0.233:32400",
9191- "usersallow": ["maryUser"], // still need to specify mary as user so not all users who play from 'podcasts' get scrobbled
9292- "librariesAllow": ["podcasts"]
9393- }
9494- },
9595- {
9696- "type": "plex",
9797- "id": "partyPlex",
9898- "name": "Party Library",
9999- // omitting clients (or making it empty) will make this Source scrobble to all Clients
100100- "data": {
101101- "token": "JtRnwQWD__XMJF8sT3jc",
102102- "url": "192.168.0.233:32400",
103103- "librariesAllow": ["party"]
104104- }
105105- },
106106- {
107107- "type": "jellyfin",
108108- "id": "fredJelly",
109109- "name": "Freds Jellyfin",
110110- // omitting clients (or making it empty) will make this Source scrobble to all Clients
111111- "data": {
112112- "url": "http://localhost:8096",
113113- "user": "FoxxMD",
114114- "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c",
115115- "usersAllow": ["fredUser"]
116116- }
117117- },
118118- {
119119- "type": "subsonic",
120120- "id": "foxxNavi",
121121- "name": "Foxx Navidrome",
122122- "clients": ["foxxMaloja"],
123123- "data": {
124124- "user": "foxx",
125125- "password": "foxxPassword",
126126- "url": "https://navidrome.foxx.example"
127127- }
128128- },
129129- {
130130- "type": "ytmusic",
131131- "id": "foxxTube",
132132- "name": "Foxx YT",
133133- "clients": ["foxxMaloja"],
134134- "data": {
135135- "cookie": "__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...",
136136- }
137137- },
138138- {
139139- "type": "endpointlz",
140140- "id": "lzFoxx",
141141- "name": "Foxx LZ",
142142- "clients": ["foxxMaloja"],
143143- "data": {
144144- "token": "myToken"
145145- }
146146- }
147147- ],
148148- "clients": [
149149- {
150150- "type": "maloja",
151151- "id": "foxxMaloja",
152152- "name": "Foxx Maloja",
153153- "data": {
154154- "url": "https://maloja.foxx.example",
155155- "apiKey": "foxxApiKey"
156156- }
157157- },
158158- {
159159- "type": "maloja",
160160- "id": "fredMaloja",
161161- "name": "Fred Maloja",
162162- "data": {
163163- "url": "https://maloja.fred.example",
164164- "apiKey": "fredApiKey"
165165- }
166166- },
167167- {
168168- "type": "maloja",
169169- "id": "maryMaloja",
170170- "name": "Mary Maloja",
171171- "data": {
172172- "url": "https://maloja.mary.example",
173173- "apiKey": "maryApiKey"
174174- }
175175- },
176176- {
177177- "type": "lastfm",
178178- "id": "maryLFM"
179179- "name": "Mary Lastfm",
180180- "data": {
181181- "apiKey": "maryApiKey",
182182- "secret": "marySecret",
183183- "redirectUri": "http://localhost:9078/lastfm/callback"
184184- }
185185- }
186186- ]
187187-}
6868+<summary>Configuration</summary>
6969+7070+<MultiPersonsServices/>
18871189189-```
7272+</details>
19073191191-### Separate JSON files
7474+### Use Musicbrainz to Fix Scrobbles from Navidrome
19275193193-```json5 title="CONFIG_DIR/spotify.json"
194194-[
195195- {
196196- // may omit 'type' property since app knows this is file is for spotify configs
197197- "id": "foxxSpot",
198198- "name": "Foxx Spotify",
199199- "clients": ["foxxMaloja"],
200200- "data": {
201201- "clientId": "foxxSpotifyAppId",
202202- "clientSecret": "foxxSpotifyAppSecret"
203203- }
204204- },
205205- {
206206- "id": "marySpot",
207207- "name": "Marys Spotify",
208208- "clients": ["maryMaloja"],
209209- "data": {
210210- "clientId": "foxxSpotifyAppId",
211211- "clientSecret": "foxxSpotifyAppSecret"
212212- }
213213- },
214214- {
215215- "type": "spotify",
216216- "id": "fredSpot",
217217- "clients": ["fredMaloja"],
218218- "data": {
219219- "accessToken": "fredsToken",
220220- "refreshToken": "fredsRefreshToken",
221221- "interval": 120
222222- }
223223- },
224224-]
225225-```
7676+You have multiple Sources of music but your personal, on-filesystem music collection is not well organized.
22677227227-```json5 title="CONFIG_DIR/plex.json"
228228-[
229229- {
230230- "type": "plex",
231231- "id": "fredPlex",
232232- "clients": ["fredMaloja"],
233233- "data": {
234234- "token": "JtRnwQWD__XMJF8sT3jc",
235235- "url": "192.168.0.233:32400",
236236- "usersallow": ["fredUser"]
237237- }
238238- },
239239- {
240240- "type": "plex",
241241- "id": "maryPlex",
242242- "clients": ["maryMaloja"],
243243- "data": {
244244- "token": "JtRnwQWD__XMJF8sT3jc",
245245- "url": "192.168.0.233:32400",
246246- "usersallow": ["maryUser"],
247247- "librariesAllow": ["podcasts"]
248248- }
249249- },
250250- {
251251- "type": "plex",
252252- "id": "partyPlex",
253253- "data": {
254254- "token": "JtRnwQWD__XMJF8sT3jc",
255255- "url": "192.168.0.233:32400",
256256- "librariesAllow": ["party"]
257257- }
258258- }
259259-]
260260-```
7878+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.
26179262262-```json5 title="CONFIG_DIR/jellyfin.json"
263263-[
264264- {
265265- "type": "jellyfin",
266266- "id": "fredJelly",
267267- "data": {
268268- "url": "http://localhost:8096",
269269- "user": "FoxxMD",
270270- "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c",
271271- "usersAllow": ["fredUser"]
272272- }
273273- }
274274-]
275275-```
8080+* You want to **scrobble from...**
8181+ * A [Spotify](/configuration/sources/spotify) account
8282+ * A Navidrome instance that you want to use with the built-in [listenbrainz](/configuration/sources/listenbrainz-endpoint) scrobble function
8383+ * Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients
8484+* You want to **scrobble to...**
8585+ * A [Last.fm](/configuration/clients/lastfm) account
27686277277-```json5 title="CONFIG_DIR/ytmusic.json"
278278-[
279279- {
280280- "type": "ytmusic",
281281- "id": "foxxTube",
282282- "clients": ["foxxMaloja"],
283283- "data": {
284284- "cookie": "__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...",
285285- }
286286- }
287287-]
288288-```
289289-```json5 title="CONFIG_DIR/endpointlz.json"
290290-[
291291- {
292292- "id": "lzFoxx",
293293- "name": "Foxx LZ",
294294- "clients": ["foxxMaloja"],
295295- "data": {
296296- "token": "myToken",
297297- }
298298- }
299299-]
300300-```
8787+<details>
30188302302-```json5 title="CONFIG_DIR/maloja.json"
303303-[
304304- {
305305- "type": "maloja",
306306- "id": "foxxMaloja",
307307- "data": {
308308- "url": "https://maloja.foxx.example",
309309- "apiKey": "foxxApiKey"
310310- }
311311- },
312312- {
313313- "type": "maloja",
314314- "id": "fredMaloja",
315315- "data": {
316316- "url": "https://maloja.fred.example",
317317- "apiKey": "fredApiKey"
318318- }
319319- },
320320- {
321321- "type": "maloja",
322322- "id": "maryMaloja",
323323- "data": {
324324- "url": "https://maloja.mary.example",
325325- "apiKey": "maryApiKey"
326326- }
327327- }
328328-]
329329-```
8989+<summary>Configuration</summary>
33090331331-```json5 title="CONFIG_DIR/lastfm.json"
332332-[
333333- {
334334- "type": "lastfm",
335335- "id": "maryLFM"
336336- "data": {
337337- "apiKey": "maryApiKey",
338338- "secret": "marySecret",
339339- "redirectUri": "http://localhost:9078/lastfm/callback"
340340- }
341341- }
342342-]
343343-```
9191+<Musicbrainz/>
344929393+</details>
···11+<DetailsAdmo type="important" summary="ENV Config Not Possible">
22+33+In this usescase there is **more than one of the same type of Source/Client.**
44+55+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.
66+77+</DetailsAdmo>
···11+:::note
22+33+In this usescase there is **at most one type of Source/Client**.
44+55+This means it is possible to use any [configuration type](/configuration#configuration-types).
66+77+:::