{ "$schema": "http://json-schema.org/draft-07/schema#", "anyOf": [ { "$ref": "#/definitions/ChromecastSourceConfig" }, { "$ref": "#/definitions/DeezerSourceConfig" }, { "$ref": "#/definitions/JellySourceConfig" }, { "$ref": "#/definitions/JRiverSourceConfig" }, { "$ref": "#/definitions/KodiSourceConfig" }, { "$ref": "#/definitions/LastfmSourceConfig" }, { "$ref": "#/definitions/ListenBrainzSourceConfig" }, { "$ref": "#/definitions/MopidySourceConfig" }, { "$ref": "#/definitions/MPRISSourceConfig" }, { "$ref": "#/definitions/MusikcubeSourceConfig" }, { "$ref": "#/definitions/PlexSourceConfig" }, { "$ref": "#/definitions/SpotifySourceConfig" }, { "$ref": "#/definitions/SubSonicSourceConfig" }, { "$ref": "#/definitions/TautulliSourceConfig" }, { "$ref": "#/definitions/WebScrobblerSourceConfig" }, { "$ref": "#/definitions/YTMusicSourceConfig" } ], "definitions": { "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" }, "ChromecastSourceConfig": { "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" } }, "required": [ "data" ], "title": "ChromecastSourceConfig", "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" }, "DeezerSourceConfig": { "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" } }, "required": [ "data" ], "title": "DeezerSourceConfig", "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" }, "JRiverSourceConfig": { "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" } }, "required": [ "data" ], "title": "JRiverSourceConfig", "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" }, "JellySourceConfig": { "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" } }, "required": [ "data" ], "title": "JellySourceConfig", "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" }, "KodiSourceConfig": { "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" } }, "required": [ "data" ], "title": "KodiSourceConfig", "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" }, "LastfmSourceConfig": { "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" } }, "required": [ "data" ], "title": "LastfmSourceConfig", "type": "object" }, "ListenBrainzSourceConfig": { "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" } }, "required": [ "data" ], "title": "ListenBrainzSourceConfig", "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" }, "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" }, "MPRISSourceConfig": { "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" } }, "required": [ "data" ], "title": "MPRISSourceConfig", "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" }, "MopidySourceConfig": { "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" } }, "required": [ "data" ], "title": "MopidySourceConfig", "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" }, "MusikcubeSourceConfig": { "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" } }, "required": [ "data" ], "title": "MusikcubeSourceConfig", "type": "object" }, "PlexSourceConfig": { "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" } }, "required": [ "data" ], "title": "PlexSourceConfig", "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" }, "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" }, "SpotifySourceConfig": { "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" } }, "required": [ "data" ], "title": "SpotifySourceConfig", "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" }, "SubSonicSourceConfig": { "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" } }, "required": [ "data" ], "title": "SubSonicSourceConfig", "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" }, "TautulliSourceConfig": { "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" } }, "required": [ "data" ], "title": "TautulliSourceConfig", "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" }, "WebScrobblerSourceConfig": { "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" } }, "title": "WebScrobblerSourceConfig", "type": "object" }, "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" }, "YTMusicSourceConfig": { "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" } }, "required": [ "data" ], "title": "YTMusicSourceConfig", "type": "object" } } }