|
5 | 5 | * [Specific File Configuration](#specific-file-configuration) |
6 | 6 | * [Source Configurations](#source-configurations) |
7 | 7 | * [Spotify](#spotify) |
8 | | - * [ENV-Based](#env-based) |
9 | | - * [File-Based](#file-based) |
10 | 8 | * [Plex](#plex) |
11 | | - * [ENV-Based](#env-based-1) |
12 | | - * [File-Based](#file-based-1) |
13 | 9 | * [Tautulli](#tautulli) |
14 | | - * [ENV-Based](#env-based-2) |
15 | | - * [File-Based](#file-based-2) |
16 | 10 | * [Subsonic](#subsonic) |
17 | | - * [ENV-Based](#env-based-3) |
18 | | - * [File-Based](#file-based-3) |
19 | 11 | * [Jellyfin](#jellyfin) |
20 | | - * [ENV-Based](#env-based-4) |
21 | | - * [File-Based](#file-based-4) |
22 | 12 | * [Last.fm (Source)](#lastfm--source-) |
23 | | - * [ENV-Based](#env-based-5) |
24 | | - * [File-Based](#file-based-5) |
25 | 13 | * [Deezer](#deezer) |
26 | | - * [ENV-Based](#env-based-6) |
27 | | - * [File-Based](#file-based-6) |
| 14 | + * [Youtube Music](#youtube-music) |
28 | 15 | * [Client Configurations](#client-configurations) |
29 | 16 | * [Maloja](#maloja) |
30 | | - * [ENV-Based](#env-based-7) |
31 | | - * [File-Based](#file-based-7) |
32 | 17 | * [Last.fm](#lastfm) |
33 | | - * [ENV-Based](#env-based-8) |
34 | | - * [File-Based](#file-based-8) |
| 18 | +* [Monitoring](#monitoring) |
| 19 | + * [Webhooks](#webhook-configurations) |
| 20 | + * [Health Endpoint](#health-endpoint) |
35 | 21 |
|
36 | 22 | # Configuration Overview |
37 | 23 |
|
@@ -310,6 +296,33 @@ After starting multi-scrobbler with credentials in-place open the dashboard (`ht |
310 | 296 |
|
311 | 297 | See [`deezer.json.example`](/config/deezer.json.example) or [explore the schema with an example and live editor/validator](https://json-schema.app/view/%23/%23%2Fdefinitions%2FDeezerSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fdevelop%2Fsrc%2Fcommon%2Fschema%2Fsource.json) |
312 | 298 |
|
| 299 | +## [Youtube Music](https://music.youtube.com) |
| 300 | + |
| 301 | +Credentials for YT Music are obtained from a browser request to https://music.youtube.com **once you are logged in.** [Specific requirements are here and summarized below:](https://github.com/nickp10/youtube-music-ts-api/blob/master/DOCUMENTATION.md#authenticate) |
| 302 | + |
| 303 | +* Open a new tab |
| 304 | +* Open the developer tools (Ctrl-Shift-I) and select the “Network” tab |
| 305 | +* Go to https://music.youtube.com and ensure you are logged in |
| 306 | + |
| 307 | +Then... |
| 308 | + |
| 309 | +1. Find and select an authenticated POST request. The simplest way is to filter by /browse using the search bar of the developer tools. If you don’t see the request, try scrolling down a bit or clicking on the library button in the top bar. |
| 310 | +2. **Make sure **Headers** pane is selected and open |
| 311 | +3. In the **Request Headers** section find and copy the **entire value** found after `Cookie:` and use this as the `cookie` value in your multi-scrobbler config |
| 312 | +4. If present, in the **Request Headers** section find and copy the number found in `X-google-AuthUser` and use this as the value for `authUser` in your multi-scrobbler config |
| 313 | + |
| 314 | + |
| 315 | + |
| 316 | +NOTES: |
| 317 | + |
| 318 | +* YT Music authentication is "browser based" which means your credentials may expire after a (long?) period of time OR if you log out of https://music.youtube.com. In the event this happens just repeat the steps above to get new credentials. |
| 319 | +* Communication to YT Music is **unofficial** and not supported or endorsed by Google. This means that **this integration may stop working at any time** if Google decides to change how YT Music works in the browser. |
| 320 | + |
| 321 | +### File-Based |
| 322 | + |
| 323 | +See [`ytmusic.json.example`](/config/ytmusic.json.example) or [explore the schema with an example and live editor/validator](https://json-schema.app/view/%23/%23%2Fdefinitions%2FYTMusicSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fdevelop%2Fsrc%2Fcommon%2Fschema%2Fsource.json) |
| 324 | + |
| 325 | + |
313 | 326 | # Client Configurations |
314 | 327 |
|
315 | 328 | ## [Maloja](https://github.com/krateng/maloja) |
@@ -347,3 +360,105 @@ or replace `localhost:9078` with your own base URL |
347 | 360 | ### File-Based |
348 | 361 |
|
349 | 362 | See [`lastfm.json.example`](/config/lastfm.json.example) or [explore the schema with an example and live editor/validator](https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fdevelop%2Fsrc%2Fcommon%2Fschema%2Fclient.json) |
| 363 | + |
| 364 | +# Monitoring |
| 365 | + |
| 366 | +multi-scrobbler supports some common webhooks and a healthcheck endpoint in order to monitor Sources and Clients for errors. |
| 367 | + |
| 368 | +## Webhook Configurations |
| 369 | + |
| 370 | +Webhooks will **push** a notification to your configured servers on these events: |
| 371 | + |
| 372 | +* Source polling started |
| 373 | +* Source polling retry |
| 374 | +* Source polling stopped on error |
| 375 | +* Scrobble client scrobble failure |
| 376 | + |
| 377 | +Webhooks are configured in the main [config.json](#all-in-one-file-configuration) file under the `webhook` top-level property. Multiple webhooks may be configured for each webhook type. EX: |
| 378 | + |
| 379 | +```json |
| 380 | +{ |
| 381 | + "sources": [ |
| 382 | + ... |
| 383 | + ], |
| 384 | + "clients": [ |
| 385 | + ... |
| 386 | + ], |
| 387 | + "webhooks": [ |
| 388 | + { |
| 389 | + "name": "FirstGotifyServer", |
| 390 | + "type": "gotify", |
| 391 | + "url": "http://192.168.0.100:8070", |
| 392 | + "token": "abcd" |
| 393 | + }, |
| 394 | + { |
| 395 | + "name": "SecondGotifyServer", |
| 396 | + "type": "gotify", |
| 397 | + ... |
| 398 | + }, |
| 399 | + { |
| 400 | + "name": "NtfyServerOne", |
| 401 | + "type": "ntfy", |
| 402 | + ... |
| 403 | + }, |
| 404 | + ... |
| 405 | + ] |
| 406 | +} |
| 407 | +``` |
| 408 | + |
| 409 | +### [Gotify](https://gotify.net/) |
| 410 | + |
| 411 | +Refer to the [config schema for GotifyConfig](https://json-schema.app/view/%23/%23%2Fdefinitions%2FGotifyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fdevelop%2Fsrc%2Fcommon%2Fschema%2Faio.json) |
| 412 | + |
| 413 | +multi-scrobbler optionally supports setting message notification priority via `info` `warn` and `error` mappings. |
| 414 | + |
| 415 | +EX |
| 416 | + |
| 417 | +```json |
| 418 | +{ |
| 419 | + "type": "gotify", |
| 420 | + "name": "MyGotifyFriendlyNameForLogs", |
| 421 | + "url": "http://192.168.0.100:8070", |
| 422 | + "token": "AQZI58fA.rfSZbm", |
| 423 | + "priorities": { |
| 424 | + "info": 5, |
| 425 | + "warn": 7, |
| 426 | + "error": 10 |
| 427 | + } |
| 428 | +} |
| 429 | +``` |
| 430 | + |
| 431 | +### [Ntfy](https://ntfy.sh/) |
| 432 | + |
| 433 | +Refer to the [config schema for NtfyConfig](https://json-schema.app/view/%23/%23%2Fdefinitions%2FNtfyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fdevelop%2Fsrc%2Fcommon%2Fschema%2Faio.json) |
| 434 | + |
| 435 | +multi-scrobbler optionally supports setting message notification priority via `info` `warn` and `error` mappings. |
| 436 | + |
| 437 | +EX |
| 438 | + |
| 439 | +```json |
| 440 | +{ |
| 441 | + "type": "ntfy", |
| 442 | + "name": "MyNtfyFriendlyNameForLogs", |
| 443 | + "url": "http://192.168.0.100:9991", |
| 444 | + "topic": "RvOwKJ1XtIVMXGLR", |
| 445 | + "username": "Optional", |
| 446 | + "password": "Optional", |
| 447 | + "priorities": { |
| 448 | + "info": 3, |
| 449 | + "warn": 4, |
| 450 | + "error": 5 |
| 451 | + } |
| 452 | +} |
| 453 | +``` |
| 454 | + |
| 455 | +## Health Endpoint |
| 456 | + |
| 457 | +An endpoint for monitoring the health of sources/clients is available at GET `http://YourMultiScrobblerDomain/health` |
| 458 | + |
| 459 | +* Returns `200 OK` when **everything** is working or `500 Internal Server Error` if **anything** is not |
| 460 | +* The plain url (`/health`) aggregates status of **all clients/sources** -- so any failing client/source will make status return 500 |
| 461 | + * Use query params `type` or `name` to restrict client/sources aggregated IE `/health?type=spotify` or `/health?name=MyMaloja` |
| 462 | +* On 500 the response returns a JSON payload with `messages` array that describes any issues |
| 463 | + * For any clients/sources that require authentication `/health` will return 500 if they are **not authenticated** |
| 464 | + * For sources that poll (spotify, yt music, subsonic) `/health` will 500 if they are **not polling** |
0 commit comments