multi-scrobbler/docsite/static/aio.json

2972 lines
119 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"AppriseConfig": {
"properties": {
"host": {
"description": "The URL of the apprise-api server",
"examples": [
"http://192.168.0.100:8078"
],
"title": "host",
"type": "string"
},
"keys": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "If using [Persistent Store Endpoints](https://github.com/caronc/apprise-api?tab=readme-ov-file#persistent-storage-solution) the Configuration ID(s) to send to\n\nNote: If multiple keys are defined then MS will attempt to POST to each one individually",
"title": "keys"
},
"name": {
"description": "A friendly name used to identify webhook config in logs",
"title": "name",
"type": "string"
},
"tags": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "Optional [tag(s)](https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging) to send in the notification payload",
"title": "tags"
},
"type": {
"description": "Webhook type. Valid values are:\n\n* gotify\n* ntfy",
"enum": [
"apprise",
"gotify",
"ntfy"
],
"examples": [
"gotify"
],
"title": "type",
"type": "string"
},
"urls": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "If using [Stateless Endpoints](https://github.com/caronc/apprise-api?tab=readme-ov-file#stateless-solution) the Apprise config URL(s) to send",
"title": "urls"
}
},
"required": [
"host",
"type"
],
"title": "AppriseConfig",
"type": "object"
},
"ChromecastData": {
"properties": {
"allowUnknownMedia": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "boolean"
}
],
"default": false,
"description": "Chromecast Apps report a \"media type\" in the status info returned for whatever is currently playing\n\n* If set to TRUE then Music AND Generic/Unknown media will be tracked for ALL APPS\n* If set to FALSE then only media explicitly typed as Music will be tracked for ALL APPS\n* If set to a list then only Apps whose name contain one of these values, case-insensitive, will have Music AND Generic/Unknown tracked\n\nSee https://developers.google.com/cast/docs/media/messages#MediaInformation \"metadata\" property",
"title": "allowUnknownMedia"
},
"blacklistApps": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "DO NOT scrobble from any application that START WITH these values, case-insensitive",
"examples": [
[
"spotify",
"pandora"
]
],
"title": "blacklistApps"
},
"blacklistDevices": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "DO NOT scrobble from any cast devices that START WITH these values, case-insensitive\n\nUseful when used with auto discovery",
"examples": [
[
"home-mini",
"family-tv"
]
],
"title": "blacklistDevices"
},
"devices": {
"description": "A list of Google Cast devices to monitor\n\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set",
"items": {
"$ref": "#/definitions/ChromecastDeviceInfo"
},
"title": "devices",
"type": "array"
},
"forceMediaRecognitionOn": {
"description": "Media provided by any App whose name is listed here will ALWAYS be tracked, regardless of the \"media type\" reported\n\nApps will be recognized if they CONTAIN any of these values, case-insensitive",
"items": {
"type": "string"
},
"title": "forceMediaRecognitionOn",
"type": "array"
},
"useAutoDiscovery": {
"description": "Use mDNS to discovery Google Cast devices on your next automatically?\n\nIf not explicitly set then it is TRUE if `devices` is not set",
"title": "useAutoDiscovery",
"type": "boolean"
},
"useAvahi": {
"default": false,
"description": "Try to use Avahi and avahi-browse to resolve mDNS devices instead of native mDNS querying\n\nUseful for docker (alpine) container where mDNS resolution is not yet supported. Avahi socket must be exposed to the container and avahi-tools must be installed.",
"title": "useAvahi",
"type": "boolean"
},
"whitelistApps": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "ONLY scrobble from any application that START WITH these values, case-insensitive\n\nIf whitelist is present then blacklist is ignored",
"examples": [
[
"spotify",
"pandora"
]
],
"title": "whitelistApps"
},
"whitelistDevices": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "ONLY scrobble from any cast device that START WITH these values, case-insensitive\n\nIf whitelist is present then blacklist is ignored\n\nUseful when used with auto discovery",
"examples": [
[
"home-mini",
"family-tv"
]
],
"title": "whitelistDevices"
}
},
"title": "ChromecastData",
"type": "object"
},
"ChromecastDeviceInfo": {
"properties": {
"address": {
"description": "The IP address of the device",
"examples": [
"192.168.0.115"
],
"title": "address",
"type": "string"
},
"name": {
"description": "A friendly name to identify this device",
"examples": [
"MySmartTV"
],
"title": "name",
"type": "string"
}
},
"required": [
"address",
"name"
],
"title": "ChromecastDeviceInfo",
"type": "object"
},
"ChromecastSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/ChromecastData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"chromecast"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "ChromecastSourceAIOConfig",
"type": "object"
},
"ClientAIOConfig": {
"anyOf": [
{
"$ref": "#/definitions/LastfmClientAIOConfig"
},
{
"$ref": "#/definitions/ListenBrainzClientAIOConfig"
},
{
"$ref": "#/definitions/MalojaClientAIOConfig"
}
],
"title": "ClientAIOConfig"
},
"ClientDefaults": {
"properties": {
"checkExistingScrobbles": {
"default": true,
"description": "Check client for an existing scrobble at the same recorded time as the \"new\" track to be scrobbled. If an existing scrobble is found this track is not track scrobbled.",
"examples": [
true
],
"title": "checkExistingScrobbles",
"type": "boolean"
},
"deadLetterRetries": {
"default": 1,
"description": "Number of times MS should automatically retry scrobbles in dead letter queue",
"examples": [
1
],
"title": "deadLetterRetries",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"refreshEnabled": {
"default": true,
"description": "Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history",
"examples": [
true
],
"title": "refreshEnabled",
"type": "boolean"
},
"refreshInitialCount": {
"description": "The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported for the client.",
"title": "refreshInitialCount",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"verbose": {
"description": "Options used for increasing verbosity of logging in MS (used for debugging)",
"properties": {
"match": {
"$ref": "#/definitions/MatchLoggingOptions",
"title": "match"
}
},
"title": "verbose",
"type": "object"
}
},
"title": "ClientDefaults",
"type": "object"
},
"CommonClientData": {
"title": "CommonClientData",
"type": "object"
},
"CommonClientOptions": {
"properties": {
"checkExistingScrobbles": {
"default": true,
"description": "Check client for an existing scrobble at the same recorded time as the \"new\" track to be scrobbled. If an existing scrobble is found this track is not track scrobbled.",
"examples": [
true
],
"title": "checkExistingScrobbles",
"type": "boolean"
},
"deadLetterRetries": {
"default": 1,
"description": "Number of times MS should automatically retry scrobbles in dead letter queue",
"examples": [
1
],
"title": "deadLetterRetries",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"refreshEnabled": {
"default": true,
"description": "Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history",
"examples": [
true
],
"title": "refreshEnabled",
"type": "boolean"
},
"refreshInitialCount": {
"description": "The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported for the client.",
"title": "refreshInitialCount",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"verbose": {
"description": "Options used for increasing verbosity of logging in MS (used for debugging)",
"properties": {
"match": {
"$ref": "#/definitions/MatchLoggingOptions",
"title": "match"
}
},
"title": "verbose",
"type": "object"
}
},
"title": "CommonClientOptions",
"type": "object"
},
"CommonSourceOptions": {
"properties": {
"logFilterFailure": {
"default": "warn",
"description": "If this source has INGRESS to MS and has filters this determines how MS logs when a payload (event) fails a defined filter (IE users/servers/library filters)\n\n* `false` => do not log\n* `debug` => log to DEBUG level\n* `warn` => log to WARN level (default)\n\nHint: This is useful if you are sure this source is setup correctly and you have multiple other sources. Set to `debug` or `false` to reduce log noise.",
"enum": [
"debug",
false,
"warn"
],
"examples": [
"warn"
],
"title": "logFilterFailure"
},
"logPayload": {
"default": false,
"description": "If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload)\nthen setting this option to true will make MS log the payload JSON to DEBUG output",
"examples": [
false
],
"title": "logPayload",
"type": "boolean"
},
"logPlayerState": {
"default": false,
"description": "For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output",
"examples": [
false
],
"title": "logPlayerState",
"type": "boolean"
},
"maxPollRetries": {
"default": 5,
"description": "default # of automatic polling restarts on error",
"examples": [
5
],
"title": "maxPollRetries",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"scrobbleBacklog": {
"default": true,
"description": "If this source\n\n* supports fetching a listen history\n* and this option is enabled\n\nthen on startup MS will attempt to scrobble the recent listens from that history",
"examples": [
true,
false
],
"title": "scrobbleBacklog",
"type": "boolean"
},
"scrobbleBacklogCount": {
"description": "The number of listens to fetch when scrobbling from backlog\n\n* Only applies if this source supports fetching a listen history\n* If not specified it defaults to the maximum number of listens the source API supports",
"title": "scrobbleBacklogCount",
"type": "number"
},
"scrobbleThresholds": {
"$ref": "#/definitions/ScrobbleThresholds",
"description": "Set thresholds for when multi-scrobbler should consider a tracked play to be \"scrobbable\". If both duration and percent are defined then if either condition is met the track is scrobbled.",
"title": "scrobbleThresholds"
}
},
"title": "CommonSourceOptions",
"type": "object"
},
"DeezerData": {
"properties": {
"clientId": {
"description": "deezer client id",
"examples": [
"a89cba1569901a0671d5a9875fed4be1"
],
"title": "clientId",
"type": "string"
},
"clientSecret": {
"description": "deezer client secret",
"examples": [
"ec42e09d5ae0ee0f0816ca151008412a"
],
"title": "clientSecret",
"type": "string"
},
"interval": {
"default": 60,
"description": "optional, how long to wait before calling spotify for new tracks (in seconds)",
"examples": [
60
],
"title": "interval",
"type": "number"
},
"redirectUri": {
"default": "http://localhost:9078/deezer/callback",
"description": "deezer redirect URI -- required only if not the default shown here. URI must end in \"callback\"",
"examples": [
"http://localhost:9078/deezer/callback"
],
"title": "redirectUri",
"type": "string"
}
},
"required": [
"clientId",
"clientSecret",
"redirectUri"
],
"title": "DeezerData",
"type": "object"
},
"DeezerSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/DeezerData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"deezer"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "DeezerSourceAIOConfig",
"type": "object"
},
"FileLogOptions": {
"properties": {
"frequency": {
"anyOf": [
{
"enum": [
"daily",
"hourly"
],
"type": "string"
},
{
"type": "number"
}
],
"default": "'daily'",
"description": "The amount of time a given rolling log file is used. Can be combined with size.\n\nUse `daily` or `hourly` to rotate file every day (or every hour). Existing file within the current day (or hour) will be re-used.\n\nNumerical values will be considered as a number of milliseconds. Using a numerical value will always create a new file upon startup.",
"title": "frequency"
},
"level": {
"description": "Specify the minimum log level to output to rotating files. If `false` no log files will be created.",
"enum": [
"debug",
"error",
false,
"fatal",
"info",
"log",
"silent",
"verbose",
"warn"
],
"title": "level"
},
"path": {
"default": "'./logs/app.log'",
"description": "The path and filename to use for log files.\n\nIf using rolling files the filename will be appended with `.N` (a number) BEFORE the extension based on rolling status.\n\nMay also be specified using env LOG_PATH or a function that returns a string.\n\nIf path is relative the absolute path will be derived from `logBaseDir` (in `LoggerAppExtras`) which defaults to CWD",
"title": "path",
"type": [
"string",
"object"
]
},
"size": {
"default": "'10MB'",
"description": "The maximum size of a given rolling log file.\n\nCan be combined with frequency. Use k, m and g to express values in KB, MB or GB.\n\nNumerical values will be considered as MB.",
"title": "size",
"type": [
"string",
"number"
]
},
"timestamp": {
"default": "'auto'",
"description": "For rolling log files\n\nWhen\n* value passed to rolling destination is a string (`path` from LogOptions is a string) and\n* `frequency` is defined\n\nThis determines the format of the datetime inserted into the log file name:\n\n* `unix` - unix epoch timestamp in milliseconds\n* `iso` - Full [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) datetime IE '2024-03-07T20:11:34Z'\n* `auto`\n * When frequency is `daily` only inserts date IE YYYY-MM-DD\n * Otherwise inserts full ISO8601 datetime",
"enum": [
"auto",
"iso",
"unix"
],
"title": "timestamp",
"type": "string"
}
},
"title": "FileLogOptions",
"type": "object"
},
"GotifyConfig": {
"properties": {
"name": {
"description": "A friendly name used to identify webhook config in logs",
"title": "name",
"type": "string"
},
"priorities": {
"$ref": "#/definitions/PrioritiesConfig",
"description": "Priority of messages\n\n* Info -> 5\n* Warn -> 7\n* Error -> 10",
"title": "priorities"
},
"token": {
"description": "The token created for this Application in Gotify",
"examples": [
"AQZI58fA.rfSZbm"
],
"title": "token",
"type": "string"
},
"type": {
"description": "Webhook type. Valid values are:\n\n* gotify\n* ntfy",
"enum": [
"apprise",
"gotify",
"ntfy"
],
"examples": [
"gotify"
],
"title": "type",
"type": "string"
},
"url": {
"description": "The URL of the Gotify server. Same URL that would be used to reach the Gotify UI",
"examples": [
"http://192.168.0.100:8078"
],
"title": "url",
"type": "string"
}
},
"required": [
"token",
"type",
"url"
],
"title": "GotifyConfig",
"type": "object"
},
"JRiverData": {
"properties": {
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"password": {
"description": "If you have enabled authentication, the password you set",
"title": "password",
"type": "string"
},
"url": {
"default": "http://localhost:52199/MCWS/v1/",
"description": "URL of the JRiver HTTP server to connect to\n\nmulti-scrobbler connects to the Web Service Interface endpoint that ultimately looks like this => `http://yourDomain:52199/MCWS/v1/`\n\nThe URL you provide here will have all parts not explicitly defined filled in for you so if these are not the default you must define them.\n\nParts => [default value]\n\n* Protocol => `http://`\n* Hostname => `localhost`\n* Port => `52199`\n* Path => `/MCWS/v1/`",
"examples": [
"http://localhost:52199/MCWS/v1/"
],
"title": "url",
"type": "string"
},
"username": {
"description": "If you have enabled authentication, the username you set",
"title": "username",
"type": "string"
}
},
"required": [
"url"
],
"title": "JRiverData",
"type": "object"
},
"JRiverSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/JRiverData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"jriver"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "JRiverSourceAIOConfig",
"type": "object"
},
"JellyData": {
"properties": {
"servers": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "optional list of servers to scrobble tracks from\n\nIf none are provided tracks from all servers will be scrobbled",
"examples": [
[
"MyServerName1"
]
],
"title": "servers"
},
"users": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "optional list of users to scrobble tracks from\n\nIf none are provided tracks from all users will be scrobbled",
"examples": [
[
"MyUser1",
"MyUser2"
]
],
"title": "users"
}
},
"title": "JellyData",
"type": "object"
},
"JellySourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/JellyData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"jellyfin"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "JellySourceAIOConfig",
"type": "object"
},
"KodiData": {
"properties": {
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"password": {
"description": "The password set for Remote Control via Web Sever",
"title": "password",
"type": "string"
},
"url": {
"default": "http://localhost:8080/jsonrpc",
"description": "URL of the Kodi HTTP server to connect to\n\nmulti-scrobbler connects to the Web Service Interface endpoint that ultimately looks like this => `http://yourDomain:8080/jsonrpc`\n\nThe URL you provide here will have all parts not explicitly defined filled in for you so if these are not the default you must define them.\n\nParts => [default value]\n\n* Protocol => `http://`\n* Hostname => `localhost`\n* Port => `8080`\n* Path => `/jsonrpc`",
"examples": [
"http://localhost:8080/jsonrpc"
],
"title": "url",
"type": "string"
},
"username": {
"description": "The username set for Remote Control via Web Sever",
"title": "username",
"type": "string"
}
},
"required": [
"password",
"url",
"username"
],
"title": "KodiData",
"type": "object"
},
"KodiSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/KodiData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"kodi"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "KodiSourceAIOConfig",
"type": "object"
},
"LastFmSouceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"configureAs": {
"default": "source",
"description": "When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.",
"enum": [
"source"
],
"examples": [
"source"
],
"title": "configureAs",
"type": "string"
},
"data": {
"$ref": "#/definitions/LastFmSourceData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"lastfm"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "LastFmSouceAIOConfig",
"type": "object"
},
"LastFmSourceData": {
"properties": {
"apiKey": {
"description": "API Key generated from Last.fm account",
"examples": [
"787c921a2a2ab42320831aba0c8f2fc2"
],
"title": "apiKey",
"type": "string"
},
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"redirectUri": {
"default": "http://localhost:9078/lastfm/callback",
"description": "Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \"lastfm/callback\" in the URL somewhere.",
"examples": [
"http://localhost:9078/lastfm/callback"
],
"title": "redirectUri",
"type": "string"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"secret": {
"description": "Secret generated from Last.fm account",
"examples": [
"ec42e09d5ae0ee0f0816ca151008412a"
],
"title": "secret",
"type": "string"
},
"session": {
"description": "Optional session id returned from a completed auth flow",
"title": "session",
"type": "string"
}
},
"required": [
"apiKey",
"secret"
],
"title": "LastFmSourceData",
"type": "object"
},
"LastfmClientAIOConfig": {
"properties": {
"configureAs": {
"default": "client",
"description": "Should always be `client` when using LastFM as a client",
"enum": [
"client",
"source"
],
"examples": [
"client"
],
"title": "configureAs",
"type": "string"
},
"data": {
"allOf": [
{
"$ref": "#/definitions/CommonClientData"
},
{
"$ref": "#/definitions/LastfmData"
}
],
"description": "Specific data required to configure this client",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this client. Used with sources to restrict where scrobbles are sent.",
"examples": [
"MyConfig"
],
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonClientOptions",
"title": "options"
},
"type": {
"enum": [
"lastfm"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"name",
"type"
],
"title": "LastfmClientAIOConfig",
"type": "object"
},
"LastfmData": {
"properties": {
"apiKey": {
"description": "API Key generated from Last.fm account",
"examples": [
"787c921a2a2ab42320831aba0c8f2fc2"
],
"title": "apiKey",
"type": "string"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"redirectUri": {
"default": "http://localhost:9078/lastfm/callback",
"description": "Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \"lastfm/callback\" in the URL somewhere.",
"examples": [
"http://localhost:9078/lastfm/callback"
],
"title": "redirectUri",
"type": "string"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"secret": {
"description": "Secret generated from Last.fm account",
"examples": [
"ec42e09d5ae0ee0f0816ca151008412a"
],
"title": "secret",
"type": "string"
},
"session": {
"description": "Optional session id returned from a completed auth flow",
"title": "session",
"type": "string"
}
},
"required": [
"apiKey",
"secret"
],
"title": "LastfmData",
"type": "object"
},
"ListenBrainzClientAIOConfig": {
"properties": {
"configureAs": {
"default": "client",
"description": "Should always be `client` when using Listenbrainz as a client",
"enum": [
"client",
"source"
],
"examples": [
"client"
],
"title": "configureAs",
"type": "string"
},
"data": {
"$ref": "#/definitions/ListenBrainzClientData",
"description": "Specific data required to configure this client",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this client. Used with sources to restrict where scrobbles are sent.",
"examples": [
"MyConfig"
],
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonClientOptions",
"title": "options"
},
"type": {
"enum": [
"listenbrainz"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"name",
"type"
],
"title": "ListenBrainzClientAIOConfig",
"type": "object"
},
"ListenBrainzClientData": {
"properties": {
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"token": {
"description": "User token for the user to scrobble for",
"examples": [
"6794186bf-1157-4de6-80e5-uvb411f3ea2b"
],
"title": "token",
"type": "string"
},
"url": {
"default": "https://api.listenbrainz.org/",
"description": "URL for the ListenBrainz server, if not using the default",
"examples": [
"https://api.listenbrainz.org/"
],
"title": "url",
"type": "string"
},
"username": {
"description": "Username of the user to scrobble for",
"title": "username",
"type": "string"
}
},
"required": [
"token",
"username"
],
"title": "ListenBrainzClientData",
"type": "object"
},
"ListenBrainzSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"configureAs": {
"default": "source",
"description": "When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.",
"enum": [
"source"
],
"examples": [
"source"
],
"title": "configureAs",
"type": "string"
},
"data": {
"$ref": "#/definitions/ListenBrainzSourceData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"listenbrainz"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "ListenBrainzSourceAIOConfig",
"type": "object"
},
"ListenBrainzSourceData": {
"properties": {
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"token": {
"description": "User token for the user to scrobble for",
"examples": [
"6794186bf-1157-4de6-80e5-uvb411f3ea2b"
],
"title": "token",
"type": "string"
},
"url": {
"default": "https://api.listenbrainz.org/",
"description": "URL for the ListenBrainz server, if not using the default",
"examples": [
"https://api.listenbrainz.org/"
],
"title": "url",
"type": "string"
},
"username": {
"description": "Username of the user to scrobble for",
"title": "username",
"type": "string"
}
},
"required": [
"token",
"username"
],
"title": "ListenBrainzSourceData",
"type": "object"
},
"LogLevel": {
"description": "Names of log levels that can be invoked on the logger\n\nFrom lowest to highest:\n\n* `debug`\n* `verbose`\n* `log`\n* `info`\n* `warn`\n* `error`\n* `fatal`\n* `silent` (will never output anything)\n\nWhen used in `LogOptions` specifies the **minimum** level the output should log at.",
"enum": [
"debug",
"error",
"fatal",
"info",
"log",
"silent",
"verbose",
"warn"
],
"title": "LogLevel",
"type": "string"
},
"LogOptions": {
"description": "Configure log levels and file options for an AppLogger.\n\n```ts\nconst infoLogger = loggerApp({\n level: 'info' // console and file will log any levels `info` and above\n});\n\nconst logger = loggerApp({\n console: 'debug', // console will log `debug` and higher\n file: 'warn' // file will log `warn` and higher\n});\n\nconst fileLogger = loggerRollingApp({\n console: 'debug', // console will log `debug` and higher\n file: {\n level: 'warn', // file will log `warn` and higher\n path: '/my/cool/path/output.log', // optionally, output to log file at this path\n frequency: 'hourly', // optionally, rotate hourly\n }\n});\n```",
"properties": {
"console": {
"$ref": "#/definitions/LogLevel",
"description": "Specify the minimum log level streamed to the console (or docker container)",
"title": "console"
},
"file": {
"anyOf": [
{
"$ref": "#/definitions/FileLogOptions"
},
{
"enum": [
"debug",
"error",
false,
"fatal",
"info",
"log",
"silent",
"verbose",
"warn"
]
}
],
"description": "Specify the minimum log level to output to rotating files or file output options. If `false` no log files will be created.",
"title": "file"
},
"level": {
"$ref": "#/definitions/LogLevel",
"default": "'info'",
"description": "Specify the minimum log level for all log outputs without their own level specified.\n\nDefaults to env `LOG_LEVEL` or `info` if not specified.",
"title": "level"
}
},
"title": "LogOptions",
"type": "object"
},
"MPRISData": {
"properties": {
"blacklist": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "DO NOT scrobble from any players that START WITH these values, case-insensitive",
"examples": [
[
"spotify",
"vlc"
]
],
"title": "blacklist"
},
"whitelist": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "ONLY from any players that START WITH these values, case-insensitive\n\nIf whitelist is present then blacklist is ignored",
"examples": [
[
"spotify",
"vlc"
]
],
"title": "whitelist"
}
},
"title": "MPRISData",
"type": "object"
},
"MPRISSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/MPRISData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"mpris"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "MPRISSourceAIOConfig",
"type": "object"
},
"MalojaClientAIOConfig": {
"properties": {
"data": {
"$ref": "#/definitions/MalojaClientData",
"description": "Specific data required to configure this client",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this client. Used with sources to restrict where scrobbles are sent.",
"examples": [
"MyConfig"
],
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonClientOptions",
"title": "options"
},
"type": {
"enum": [
"maloja"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"name",
"type"
],
"title": "MalojaClientAIOConfig",
"type": "object"
},
"MalojaClientData": {
"properties": {
"apiKey": {
"description": "API Key for Maloja server",
"examples": [
"myApiKey"
],
"title": "apiKey",
"type": "string"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"url": {
"description": "URL for maloja server",
"examples": [
"http://localhost:42010"
],
"title": "url",
"type": "string"
}
},
"required": [
"apiKey",
"url"
],
"title": "MalojaClientData",
"type": "object"
},
"MatchLoggingOptions": {
"description": "Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.",
"properties": {
"confidenceBreakdown": {
"default": false,
"description": "Include confidence breakdowns in track match logging, if applicable",
"examples": [
false
],
"title": "confidenceBreakdown",
"type": "boolean"
},
"onMatch": {
"default": false,
"description": "Log to DEBUG when a new track DOES match an existing scrobble",
"examples": [
false
],
"title": "onMatch",
"type": "boolean"
},
"onNoMatch": {
"default": false,
"description": "Log to DEBUG when a new track does NOT match an existing scrobble",
"examples": [
false
],
"title": "onNoMatch",
"type": "boolean"
}
},
"title": "MatchLoggingOptions",
"type": "object"
},
"MopidyData": {
"properties": {
"albumBlacklist": {
"default": [
"Soundcloud"
],
"description": "Remove album data that matches any case-insensitive string from this list when scrobbling,\n\nFor certain sources (Soundcloud) Mopidy does not have all track info (Album) and will instead use \"Soundcloud\" as the Album name. You can prevent multi-scrobbler from using this bad Album data by adding the fake name to this list. Multi-scrobbler will still scrobble the track, just without the bad data.",
"examples": [
[
"Soundcloud",
"Mixcloud"
]
],
"items": {
"type": "string"
},
"title": "albumBlacklist",
"type": "array"
},
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"uriBlacklist": {
"description": "Do not scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive\n\nEX: Don't scrobble tracks from soundcloud by adding 'soundcloud' to this list.\n\nList is ignored if uriWhitelist is used.",
"items": {
"type": "string"
},
"title": "uriBlacklist",
"type": "array"
},
"uriWhitelist": {
"description": "Only scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive\n\nEX: Only scrobble tracks from soundcloud by adding 'soundcloud' to this list.",
"items": {
"type": "string"
},
"title": "uriWhitelist",
"type": "array"
},
"url": {
"default": "ws://localhost:6680/mopidy/ws/",
"description": "URL of the Mopidy HTTP server to connect to\n\nYou MUST have Mopidy-HTTP extension enabled: https://mopidy.com/ext/http\n\nmulti-scrobbler connects to the WebSocket endpoint that ultimately looks like this => `ws://localhost:6680/mopidy/ws/`\n\nThe URL you provide here will have all parts not explicitly defined filled in for you so if these are not the default you must define them.\n\nParts => [default value]\n\n* Protocol => `ws://`\n* Hostname => `localhost`\n* Port => `6680`\n* Path => `/mopidy/ws/`",
"examples": [
"ws://localhost:6680/mopidy/ws/"
],
"title": "url",
"type": "string"
}
},
"title": "MopidyData",
"type": "object"
},
"MopidySourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/MopidyData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"mopidy"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "MopidySourceAIOConfig",
"type": "object"
},
"MusikcubeData": {
"properties": {
"device_id": {
"title": "device_id",
"type": "string"
},
"password": {
"description": "Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\n\n* musikcube -> settings -> server setup -> password",
"title": "password",
"type": "string"
},
"url": {
"default": "ws://localhost:7905",
"description": "URL of the Musikcube Websocket (Metadata) server to connect to\n\nYou MUST have enabled 'metadata' server and set a password: https://github.com/clangen/musikcube/wiki/remote-api-documentation\n * musikcube -> settings -> server setup\n\nThe URL you provide here will have all parts not explicitly defined filled in for you so if these are not the default you must define them.\n\nParts => [default value]\n\n* Protocol => `ws://`\n* Hostname => `localhost`\n* Port => `7905`",
"examples": [
"ws://localhost:7905"
],
"title": "url",
"type": "string"
}
},
"required": [
"password"
],
"title": "MusikcubeData",
"type": "object"
},
"MusikcubeSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/MusikcubeData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"musikcube"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "MusikcubeSourceAIOConfig",
"type": "object"
},
"NtfyConfig": {
"properties": {
"name": {
"description": "A friendly name used to identify webhook config in logs",
"title": "name",
"type": "string"
},
"password": {
"description": "Required if topic is protected",
"title": "password",
"type": "string"
},
"priorities": {
"$ref": "#/definitions/PrioritiesConfig",
"description": "Priority of messages\n\n* Info -> 3\n* Warn -> 4\n* Error -> 5",
"title": "priorities"
},
"topic": {
"description": "The topic mutli-scrobbler should POST to",
"title": "topic",
"type": "string"
},
"type": {
"description": "Webhook type. Valid values are:\n\n* gotify\n* ntfy",
"enum": [
"apprise",
"gotify",
"ntfy"
],
"examples": [
"gotify"
],
"title": "type",
"type": "string"
},
"url": {
"description": "The URL of the Ntfy server",
"examples": [
"http://192.168.0.100:8078"
],
"title": "url",
"type": "string"
},
"username": {
"description": "Required if topic is protected",
"title": "username",
"type": "string"
}
},
"required": [
"topic",
"type",
"url"
],
"title": "NtfyConfig",
"type": "object"
},
"PlexSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/PlexSourceData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"plex"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "PlexSourceAIOConfig",
"type": "object"
},
"PlexSourceData": {
"properties": {
"libraries": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "optional list of libraries to scrobble tracks from\n\nIf none are provided tracks from all libraries will be scrobbled",
"examples": [
[
"Audio",
"Music"
]
],
"title": "libraries"
},
"servers": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "optional list of servers to scrobble tracks from\n\nIf none are provided tracks from all servers will be scrobbled",
"examples": [
[
"MyServerName"
]
],
"title": "servers"
},
"user": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "optional list of users to scrobble tracks from\n\nIf none are provided tracks from all users will be scrobbled",
"examples": [
[
"MyUser1",
"MyUser2"
]
],
"title": "user"
}
},
"title": "PlexSourceData",
"type": "object"
},
"PrioritiesConfig": {
"properties": {
"error": {
"examples": [
10
],
"title": "error",
"type": "number"
},
"info": {
"examples": [
5
],
"title": "info",
"type": "number"
},
"warn": {
"examples": [
7
],
"title": "warn",
"type": "number"
}
},
"required": [
"error",
"info",
"warn"
],
"title": "PrioritiesConfig",
"type": "object"
},
"ScrobbleThresholds": {
"properties": {
"duration": {
"default": 240,
"description": "The number of seconds a track has been listened to before it should be considered scrobbled.\n\nSet to null to disable.",
"examples": [
240
],
"title": "duration",
"type": "number"
},
"percent": {
"default": 50,
"description": "The percentage (as an integer) of a track that should have been seen played before it should be scrobbled. Only used if the Source provides information about how long the track is.\n\nSet to null to disable.\n\nNOTE: This should be used with care when the Source is a \"polling\" type (has an 'interval' property). If the track is short and the interval is too high MS may ignore the track if percentage is high because it had not \"seen\" the track for long enough from first discovery, even if you have been playing the track for longer.",
"examples": [
50
],
"title": "percent",
"type": "number"
}
},
"title": "ScrobbleThresholds",
"type": "object"
},
"SourceAIOConfig": {
"anyOf": [
{
"$ref": "#/definitions/ChromecastSourceAIOConfig"
},
{
"$ref": "#/definitions/DeezerSourceAIOConfig"
},
{
"$ref": "#/definitions/JellySourceAIOConfig"
},
{
"$ref": "#/definitions/JRiverSourceAIOConfig"
},
{
"$ref": "#/definitions/KodiSourceAIOConfig"
},
{
"$ref": "#/definitions/LastFmSouceAIOConfig"
},
{
"$ref": "#/definitions/ListenBrainzSourceAIOConfig"
},
{
"$ref": "#/definitions/MopidySourceAIOConfig"
},
{
"$ref": "#/definitions/MPRISSourceAIOConfig"
},
{
"$ref": "#/definitions/MusikcubeSourceAIOConfig"
},
{
"$ref": "#/definitions/PlexSourceAIOConfig"
},
{
"$ref": "#/definitions/SpotifySourceAIOConfig"
},
{
"$ref": "#/definitions/SubsonicSourceAIOConfig"
},
{
"$ref": "#/definitions/TautulliSourceAIOConfig"
},
{
"$ref": "#/definitions/WebScrobblerSourceAIOConfig"
},
{
"$ref": "#/definitions/YTMusicSourceAIOConfig"
}
],
"title": "SourceAIOConfig"
},
"SourceDefaults": {
"properties": {
"logFilterFailure": {
"default": "warn",
"description": "If this source has INGRESS to MS and has filters this determines how MS logs when a payload (event) fails a defined filter (IE users/servers/library filters)\n\n* `false` => do not log\n* `debug` => log to DEBUG level\n* `warn` => log to WARN level (default)\n\nHint: This is useful if you are sure this source is setup correctly and you have multiple other sources. Set to `debug` or `false` to reduce log noise.",
"enum": [
"debug",
false,
"warn"
],
"examples": [
"warn"
],
"title": "logFilterFailure"
},
"logPayload": {
"default": false,
"description": "If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload)\nthen setting this option to true will make MS log the payload JSON to DEBUG output",
"examples": [
false
],
"title": "logPayload",
"type": "boolean"
},
"logPlayerState": {
"default": false,
"description": "For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output",
"examples": [
false
],
"title": "logPlayerState",
"type": "boolean"
},
"maxPollRetries": {
"default": 5,
"description": "default # of automatic polling restarts on error",
"examples": [
5
],
"title": "maxPollRetries",
"type": "number"
},
"maxRequestRetries": {
"default": 1,
"description": "default # of http request retries a source/client can make before error is thrown",
"examples": [
1
],
"title": "maxRequestRetries",
"type": "number"
},
"retryMultiplier": {
"default": 1.5,
"description": "default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)",
"examples": [
1.5
],
"title": "retryMultiplier",
"type": "number"
},
"scrobbleBacklog": {
"default": true,
"description": "If this source\n\n* supports fetching a listen history\n* and this option is enabled\n\nthen on startup MS will attempt to scrobble the recent listens from that history",
"examples": [
true,
false
],
"title": "scrobbleBacklog",
"type": "boolean"
},
"scrobbleBacklogCount": {
"description": "The number of listens to fetch when scrobbling from backlog\n\n* Only applies if this source supports fetching a listen history\n* If not specified it defaults to the maximum number of listens the source API supports",
"title": "scrobbleBacklogCount",
"type": "number"
},
"scrobbleThresholds": {
"$ref": "#/definitions/ScrobbleThresholds",
"description": "Set thresholds for when multi-scrobbler should consider a tracked play to be \"scrobbable\". If both duration and percent are defined then if either condition is met the track is scrobbled.",
"title": "scrobbleThresholds"
}
},
"title": "SourceDefaults",
"type": "object"
},
"SpotifySourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/SpotifySourceData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"spotify"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "SpotifySourceAIOConfig",
"type": "object"
},
"SpotifySourceData": {
"properties": {
"clientId": {
"description": "spotify client id",
"examples": [
"787c921a2a2ab42320831aba0c8f2fc2"
],
"title": "clientId",
"type": "string"
},
"clientSecret": {
"description": "spotify client secret",
"examples": [
"ec42e09d5ae0ee0f0816ca151008412a"
],
"title": "clientSecret",
"type": "string"
},
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)\n\nIt is unlikely you should need to change this unless you scrobble many very short tracks often\n\nReading:\n* https://developer.spotify.com/documentation/web-api/guides/rate-limits/\n* https://medium.com/mendix/limiting-your-amount-of-calls-in-mendix-most-of-the-time-rest-835dde55b10e\n * Rate limit may ~180 req/min\n* https://community.spotify.com/t5/Spotify-for-Developers/Web-API-ratelimit/m-p/5503150/highlight/true#M7930\n * Informally indicated as 20 req/sec? Probably for burstiness",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"redirectUri": {
"default": "http://localhost:9078/callback",
"description": "spotify redirect URI -- required only if not the default shown here. URI must end in \"callback\"",
"examples": [
"http://localhost:9078/callback"
],
"title": "redirectUri",
"type": "string"
}
},
"required": [
"clientId",
"clientSecret",
"redirectUri"
],
"title": "SpotifySourceData",
"type": "object"
},
"SubsonicData": {
"properties": {
"ignoreTlsErrors": {
"default": false,
"description": "If your subsonic server is using self-signed certs you may need to disable TLS errors in order to get a connection\n\nWARNING: This should be used with caution as your traffic may not be encrypted.",
"title": "ignoreTlsErrors",
"type": "boolean"
},
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"legacyAuthentication": {
"default": false,
"description": "Older Subsonic versions, and some badly implemented servers (Nextcloud), use legacy authentication which sends your password in CLEAR TEXT. This is less secure than the newer, recommended hashing authentication method but in some cases it is needed. See \"Authentication\" section here => https://www.subsonic.org/pages/api.jsp\n\nIf this option is not specified it will be turned on if the subsonic server responds with error code 41 \"Token authentication not supported for LDAP users.\" -- See Error Handling section => https://www.subsonic.org/pages/api.jsp",
"title": "legacyAuthentication",
"type": "boolean"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
},
"password": {
"description": "Password for the user to login to the server with",
"examples": [
"MyPassword"
],
"title": "password",
"type": "string"
},
"url": {
"description": "URL of the subsonic media server to query",
"examples": [
"http://airsonic.local"
],
"title": "url",
"type": "string"
},
"user": {
"description": "Username to login to the server with",
"title": "user",
"type": "string"
}
},
"required": [
"password",
"url",
"user"
],
"title": "SubsonicData",
"type": "object"
},
"SubsonicSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/SubsonicData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"subsonic"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "SubsonicSourceAIOConfig",
"type": "object"
},
"TautulliSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/PlexSourceData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"tautulli"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "TautulliSourceAIOConfig",
"type": "object"
},
"WebScrobblerData": {
"properties": {
"blacklist": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "Block scrobbling from specific WebScrobbler Connectors",
"examples": [
[
"youtube"
]
],
"title": "blacklist"
},
"slug": {
"description": "The URL ending that should be used to identify scrobbles for this source\n\nIn WebScrobbler's Webhook you must set an 'API URL'. All MS WebScrobbler sources must start like:\n\nhttp://localhost:9078/api/webscrobbler\n\nIf you are using multiple WebScrobbler sources (scrobbles for many users) you must use a slug to match Sources with each users extension.\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/webscrobbler/usera\n* slug: 'userb' => API URL: http://localhost:9078/api/webscrobbler/userb\n\nIf no slug is found from an extension's incoming webhook event the first WebScrobbler source without a slug will be used",
"title": "slug",
"type": "string"
},
"whitelist": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "string"
}
],
"description": "Only allow scrobbling from specific WebScrobbler Connectors",
"examples": [
[
"mixcloud",
"soundcloud",
"bandcamp"
]
],
"title": "whitelist"
}
},
"title": "WebScrobblerData",
"type": "object"
},
"WebScrobblerSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/WebScrobblerData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"$ref": "#/definitions/CommonSourceOptions",
"title": "options"
},
"type": {
"enum": [
"webscrobbler"
],
"title": "type",
"type": "string"
}
},
"required": [
"type"
],
"title": "WebScrobblerSourceAIOConfig",
"type": "object"
},
"WebhookConfig": {
"anyOf": [
{
"$ref": "#/definitions/GotifyConfig"
},
{
"$ref": "#/definitions/NtfyConfig"
},
{
"$ref": "#/definitions/AppriseConfig"
}
],
"title": "WebhookConfig"
},
"YTMusicData": {
"properties": {
"authUser": {
"description": "If the 'X-Goog-AuthUser' header is present in the Request Headers for music.youtube.com it must also be included",
"title": "authUser",
"type": "number"
},
"cookie": {
"description": "The cookie retrieved from the Request Headers of music.youtube.com after logging in.\n\nSee https://github.com/nickp10/youtube-music-ts-api/blob/master/DOCUMENTATION.md#authenticate and https://ytmusicapi.readthedocs.io/en/latest/setup.html#copy-authentication-headers for how to retrieve this value.",
"examples": [
"VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."
],
"title": "cookie",
"type": "string"
},
"interval": {
"default": 10,
"description": "How long to wait before polling the source API for new tracks (in seconds)",
"examples": [
10
],
"title": "interval",
"type": "number"
},
"maxInterval": {
"default": 30,
"description": "When there has been no new activity from the Source API multi-scrobbler will gradually increase the wait time between polling up to this value (in seconds)",
"examples": [
30
],
"title": "maxInterval",
"type": "number"
}
},
"required": [
"cookie"
],
"title": "YTMusicData",
"type": "object"
},
"YTMusicSourceAIOConfig": {
"properties": {
"clients": {
"description": "Restrict scrobbling tracks played from this source to Clients with names from this list. If list is empty is not present Source scrobbles to all configured Clients.",
"examples": [
[
"MyMalojaConfigName",
"MyLastFMConfigName"
]
],
"items": {
"type": "string"
},
"title": "clients",
"type": "array"
},
"data": {
"$ref": "#/definitions/YTMusicData",
"title": "data"
},
"enable": {
"default": true,
"description": "Should MS use this client/source? Defaults to true",
"examples": [
true
],
"title": "enable",
"type": "boolean"
},
"name": {
"description": "Unique identifier for this source.",
"title": "name",
"type": "string"
},
"options": {
"allOf": [
{
"$ref": "#/definitions/CommonSourceOptions"
},
{
"properties": {
"logAuthUpdateChanges": {
"description": "When true MS will log to DEBUG what parts of the cookie are updated by YTM",
"title": "logAuthUpdateChanges",
"type": "boolean"
}
},
"type": "object"
}
],
"title": "options"
},
"type": {
"enum": [
"ytmusic"
],
"title": "type",
"type": "string"
}
},
"required": [
"data",
"type"
],
"title": "YTMusicSourceAIOConfig",
"type": "object"
}
},
"properties": {
"baseUrl": {
"default": "http://localhost",
"description": "Set the Base URL the application should assume the UI is served from.\n\nThis will affect how default redirect URLs are generated (spotify, lastfm, deezer) and some logging messages.\n\nIt will NOT set the actual interface/IP that the application is listening on.\n\nThis can also be set using the BASE_URL environmental variable.",
"examples": [
"http://localhost",
"http://192.168.0.101",
"https://ms.myDomain.tld"
],
"title": "baseUrl",
"type": "string"
},
"clientDefaults": {
"$ref": "#/definitions/ClientDefaults",
"title": "clientDefaults"
},
"clients": {
"items": {
"$ref": "#/definitions/ClientAIOConfig"
},
"title": "clients",
"type": "array"
},
"debugMode": {
"default": false,
"description": "Enables ALL relevant logging and debug options for all sources/clients, when none are defined.\n\nThis is a convenience shortcut for enabling all output needed to troubleshoot an issue and does not need to be on for normal operation.\n\nIt can also be enabled with the environmental variable DEBUG_MODE=true",
"examples": [
false
],
"title": "debugMode",
"type": "boolean"
},
"disableWeb": {
"description": "Disable web server from running/listening on port.\n\nThis will also make any ingress sources (Plex, Jellyfin, Tautulli, etc...) unusable",
"title": "disableWeb",
"type": "boolean"
},
"logging": {
"$ref": "#/definitions/LogOptions",
"title": "logging"
},
"port": {
"default": 9078,
"description": "Set the port the multi-scrobbler UI will be served from",
"examples": [
9078
],
"title": "port",
"type": "number"
},
"sourceDefaults": {
"$ref": "#/definitions/SourceDefaults",
"title": "sourceDefaults"
},
"sources": {
"items": {
"$ref": "#/definitions/SourceAIOConfig"
},
"title": "sources",
"type": "array"
},
"webhooks": {
"items": {
"$ref": "#/definitions/WebhookConfig"
},
"title": "webhooks",
"type": "array"
}
},
"type": "object"
}